溫馨提示×

溫馨提示×

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

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

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

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

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

Spring5.0之:@Configuration的使用

@Configuration用于定義配置類,可替換XML配置文件,被注解的類內(nèi)部包含有一個或者多個被@Bean注解的方法,這些方法將會被AnnotationConfigApplicationContext或者AnnotationConfigWebApplicationContext類進(jìn)行掃描,并用于構(gòu)建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標(biāo)注在類上,相當(dāng)于把該類作為spring的xml配置文件中的<beans>,作用為:配置spring容器(應(yīng)用上下文)

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

相當(dāng)于:

<?xml version="1.0">

主方法進(jìn)行測試:

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");
    }
}

從運行主方法結(jié)果可以看出,spring容器已經(jīng)啟動了:

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

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

@Bean標(biāo)注在方法上(返回某個實例的方法),等價于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();
    }
}

結(jié)果:

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

注: 

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

@Bean下管理bean的生命周期

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

生命周期方法也稱為回調(diào)方法,因為它將由容器調(diào)用。使用 @Bean 注釋注冊的 bean 也支持 JSR-250 規(guī)定的標(biāo)準(zhǔn) @PostConstruct 和 @PreDestroy 注釋。如果您正在使用 XML 方法來定義 bean,那么就應(yīng)該使用 bean 元素來定義生命周期回調(diào)方法。

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

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注解的作用是什么

分析:

結(jié)果中的1:表明initMethod生效

結(jié)果中的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總結(jié)

 @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();
    }
}

結(jié)果:

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]);
        }
    }
}

結(jié)果

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

3、@EnableXXX注解

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

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

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

4、@Profile邏輯組配置

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

5、使用外部變量

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

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

思考問題:springbean對象在什么時候創(chuàng)建的?

答案:默認(rèn)情況下是非懶加載的。

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

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

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

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI