中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring5.0中Configuration注解的作用是什么

發布時間:2021-07-30 14:11:58 來源:億速云 閱讀:283 作者:Leah 欄目:大數據

這篇文章給大家介紹Spring5.0中Configuration注解的作用是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

Spring5.0之:@Configuration的使用

@Configuration用于定義配置類,可替換XML配置文件,被注解的類內部包含有一個或者多個被@Bean注解的方法,這些方法將會被AnnotationConfigApplicationContext或者AnnotationConfigWebApplicationContext類進行掃描,并用于構建Bean定義,初始化Spring容器。

@Configurationpublic class MySpringConfig {    @Beanpublic UserEntity userEntity() {
        return new UserEntity("xuyu", 21);
    }
}
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MySpringConfig.class);

一、用@Configuration加載spring

1.1、@Configuration配置spring并啟動spring容器
1.2、@Configuration啟動容器+@Bean注冊Bean
1.3、@Configuration啟動容器+@Component注冊Bean
1.4、使用 AnnotationConfigApplicationContext 注冊 AppContext 類的

二、組合多個配置類

2.1、在@configuration中引入其它注解配置
2.2、@configuration嵌套

三、@EnableXXX注解
四、@Profile邏輯組配置
五、使用外部變量

一、@Configuation加載Spring方法

1.1、@Configuration配置spring并啟動spring容器

@Configuration標注在類上,相當于把該類作為spring的xml配置文件中的<beans>,作用為:配置spring容器(應用上下文)

@Configuration
public class TestConfiguration {
    public TestConfiguration() {
        System.out.println("TestConfiguration容器啟動初始化。。。");
    }
}

相當于:

<?xml version="1.0">

主方法進行測試:

public class TestMain {
    public static void main(String[] args) {

        // @Configuration注解的spring容器加載方式,用AnnotationConfigApplicationContext替換ClassPathXmlApplicationContext
        ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class);

        // 如果加載spring-context.xml文件:
        // ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
    }
}

從運行主方法結果可以看出,spring容器已經啟動了:

Spring5.0中Configuration注解的作用是什么

1.2、@Configuration啟動容器+@Bean注冊Bean,@Bean下管理bean的生命周期

@Bean標注在方法上(返回某個實例的方法),等價于spring的xml配置文件中的<bean>,作用為:注冊bean對象

bean類:

public class TestBean {

    private String username;
    private String url;
    private String password;

    public void sayHello() {
        System.out.println("TestBean sayHello...");
    }

    public String toString() {
        return "username:" + this.username + ",url:" + this.url + ",password:" + this.password;
    }

    public void start() {
        System.out.println("TestBean 初始化。。。");
    }

    public void cleanUp() {
        System.out.println("TestBean 銷毀。。。");
    }
}

配置類:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class TestConfiguration {
    public TestConfiguration() {
        System.out.println("TestConfiguration容器啟動初始化。。。");
    }

    // @Bean注解注冊bean,同時可以指定初始化和銷毀方法
    // @Bean(name="testBean",initMethod="start",destroyMethod="cleanUp")
    @Bean
    @Scope("prototype")
    public TestBean testBean() {
        return new TestBean();
    }
}

主方法測試類:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestMain {
    public static void main(String[] args) {

        // @Configuration注解的spring容器加載方式,用AnnotationConfigApplicationContext替換ClassPathXmlApplicationContext
        ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class);

        // 如果加載spring-context.xml文件:
        // ApplicationContext context = new
        // ClassPathXmlApplicationContext("spring-context.xml");
        
         //獲取bean
        TestBean tb = (TestBean) context.getBean("testBean");
        tb.sayHello();
    }
}

結果:

Spring5.0中Configuration注解的作用是什么

注: 

(1)、@Bean注解在返回實例的方法上,如果未通過@Bean指定bean的名稱,則默認與標注的方法名相同; 
(2)、@Bean注解默認作用域為單例singleton作用域,可通過@Scope(“prototype”)設置為原型作用域; 
(3)、既然@Bean的作用是注冊bean對象,那么完全可以使用@Component、@Controller、@Service、@Ripository等注解注冊bean,當然需要配置@ComponentScan注解進行自動掃描。

@Bean下管理bean的生命周期

可以使用基于 Java 的配置來管理 bean 的生命周期。@Bean 支持兩種屬性,即 initMethod 和destroyMethod,這些屬性可用于定義生命周期方法。在實例化 bean 或即將銷毀它時,容器便可調用生命周期方法。

生命周期方法也稱為回調方法,因為它將由容器調用。使用 @Bean 注釋注冊的 bean 也支持 JSR-250 規定的標準 @PostConstruct 和 @PreDestroy 注釋。如果您正在使用 XML 方法來定義 bean,那么就應該使用 bean 元素來定義生命周期回調方法。

以下代碼顯示了在 XML 配置中通常使用 bean 元素定義回調的方法。

package com.mayikt.v1.entity;

public class TestBean {

    public void sayHello() {
        System.out.println("TestBean sayHello...");
    }
    public void start() {
        System.out.println("TestBean 初始化。。。");
    }
    public void cleanUp() {
        System.out.println("TestBean 銷毀。。。");
    }
}
@Configuration
@ComponentScan(basePackages = "com.mayikt.v1.entity")
public class TestConfiguration {
    public TestConfiguration() {
        System.out.println("TestConfiguration容器啟動初始化。。。");
    }

    //@Bean注解注冊bean,同時可以指定初始化和銷毀方法
    @Bean(name="testBean",initMethod="start",destroyMethod="cleanUp")
    @Scope("prototype")
    public TestBean testBean() {
        return new TestBean();
    }
}
public class TestMain {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class);
        TestBean tb = (TestBean) context.getBean("testBean");
        tb.sayHello();
        System.out.println(tb);

        TestBean tb2 = (TestBean) context.getBean("testBean");
        tb2.sayHello();
        System.out.println(tb2);
    }
}

Spring5.0中Configuration注解的作用是什么

分析:

結果中的1:表明initMethod生效

結果中的2:表明@Scope("prototype")生效

1.3、@Configuration啟動容器+@Component注冊Bean

//添加注冊bean的注解
@Component
public class TestBean {

    private String username;
    private String url;
    private String password;

    public void sayHello() {
        System.out.println("TestBean sayHello...");
    }
    public String toString() {
        return "username:" + this.username + ",url:" + this.url + ",password:" + this.password;
    }
    public void start() {
        System.out.println("TestBean 初始化。。。");
    }
    public void cleanUp() {
        System.out.println("TestBean 銷毀。。。");
    }
}
@Configuration
//添加自動掃描注解,basePackages為TestBean包路徑
@ComponentScan(basePackages = "com.mayikt.v1.entity")
public class TestConfiguration {
    public TestConfiguration() {
        System.out.println("TestConfiguration容器啟動初始化。。。");
    }
}
public class TestMain {
    public static void main(String[] args) {

        // @Configuration注解的spring容器加載方式,用AnnotationConfigApplicationContext替換ClassPathXmlApplicationContext
        ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class);
        // 如果加載spring-context.xml文件:
        // ApplicationContext context = new
        // ClassPathXmlApplicationContext("spring-context.xml");
        //獲取bean
       TestBean tb = (TestBean) context.getBean("testBean");
        tb.sayHello();
    }
}

Spring5.0中Configuration注解的作用是什么

1.4、使用 AnnotationConfigApplicationContext 注冊 AppContext 類

 AnnotationConfigApplicationContext 的register 方法傳入配置類來注冊配置類

public class TestMain {
    public static void main(String[] args) {
        // @Configuration注解的spring容器加載方式,用AnnotationConfigApplicationContext替換ClassPathXmlApplicationContext
        ApplicationContext context = new AnnotationConfigApplicationContext();
        ((AnnotationConfigApplicationContext) context).register(TestConfiguration.class);
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        for (int i = 0; i < beanDefinitionNames.length; i++) {
            System.out.println(beanDefinitionNames[i]);
        }
    }
}

Spring5.0中Configuration注解的作用是什么

1.5、@Configuation總結

 @Configuation等價于<Beans></Beans>

 @Bean等價于<Bean></Bean>

 @ComponentScan等價于<context:component-scan base-package="com.xxx"/>

二、組合多個配置類

 2.1、在@configuration中引入其它注解配置

@Configuration
@Import(TestConfiguration.class)
public class WebConfig {
}
@Configuration
@ComponentScan(basePackages = "com.mayikt.v1.entity")
public class TestConfiguration {
    public TestConfiguration() {
        System.out.println("TestConfiguration容器啟動初始化。。。");
    }

    //@Bean注解注冊bean,同時可以指定初始化和銷毀方法
    @Bean(name="testBean2",initMethod="start",destroyMethod="cleanUp")
    @Scope("prototype")
    public TestBean2 testBean2() {
        return new TestBean2();
    }
}
public class TestMain2 {
    public static void main(String[] args) {

        // @Configuration注解的spring容器加載方式,用AnnotationConfigApplicationContext替換ClassPathXmlApplicationContext
        ApplicationContext context = new AnnotationConfigApplicationContext(WebConfig.class);
        // 獲取bean
        TestBean2 tb2 = (TestBean2) context.getBean("testBean2");
        tb2.sayHello();

        TestBean tb = (TestBean) context.getBean("testBean");
        tb.sayHello();
    }
}

結果:

Spring5.0中Configuration注解的作用是什么

2.2、@configuration嵌套

@Configuration
public class MySpringConfig {
    @Configuration
    static class entity{
        @Bean
        UserEntity userEntity(){
            return new UserEntity("mayikt", 21);
        }
    }
    /*@Bean
    public UserEntity userEntity() {
        return new UserEntity("xuyu", 21);
    }*/
}
public class V2TestSpring {
    private static AnnotationConfigApplicationContext annotationConfigApplicationContext;

    public static void main(String[] args) {
        annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MySpringConfig.class);
        System.out.println("啟動配置加載完畢...");
        UserEntity userEntity = annotationConfigApplicationContext.getBean("userEntity", UserEntity.class);
        String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
        for (int i = 0; i < beanDefinitionNames.length; i++) {
            System.out.println(beanDefinitionNames[i]);
        }
    }
}

結果

Spring5.0中Configuration注解的作用是什么

3、@EnableXXX注解

配合@Configuration使用,包括 @EnableAsync, @EnableScheduling, @EnableTransactionManagement, @EnableAspectJAutoProxy, @EnableWebMvc。

@EnableAspectJAutoProxy---《spring AOP 之:@Aspect注解》

@EnableScheduling--《Spring 3.1新特性之二:@Enable*注解的源碼,spring源碼分析之定時任務Scheduled注解》

4、@Profile邏輯組配置

見《Spring的@PropertySource + Environment,@PropertySource(PropertySourcesPlaceholderConfigurer)+@Value配合使用》

5、使用外部變量

1、@PropertySource + Environment,通過@PropertySource注解將properties配置文件中的值存儲到Spring的 Environment中,Environment接口提供方法去讀取配置文件中的值,參數是properties文件中定義的key值。
2、@PropertySource(PropertySourcesPlaceholderConfigurer)+@Value

見《Spring的@PropertySource + Environment,@PropertySource(PropertySourcesPlaceholderConfigurer)+@Value配合使用》

思考問題:springbean對象在什么時候創建的?

答案:默認情況下是非懶加載的。

@Lazy
  • Lazy表示為懶加載,當真正需要引用獲取的時候才會被加載

  • True 表示為非懶加載 false表示為在IOC容器加載的時候被創建

@Service
@Lazy(true)
public class UserService {
    public UserService() {
        System.out.println("UserService無參數構造被加載...");
    }
}

關于Spring5.0中Configuration注解的作用是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

毕节市| 丘北县| 呼图壁县| 清原| 陇西县| 永福县| 郑州市| 原平市| 常熟市| 玉树县| 青岛市| 章丘市| 古浪县| 灌阳县| 汽车| 绍兴县| 上思县| 五原县| 当阳市| 岗巴县| 绥化市| 左贡县| 西贡区| 嘉定区| 济阳县| 烟台市| 南昌县| 葫芦岛市| 竹山县| 绥中县| 土默特左旗| 开封市| 桐乡市| 陈巴尔虎旗| 祁连县| 桂东县| 永吉县| 勐海县| 江源县| 师宗县| 定州市|