您好,登錄后才能下訂單哦!
這篇文章給大家介紹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);
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嵌套
@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容器已經啟動了:
@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(); } }
結果:
注:
(1)、@Bean注解在返回實例的方法上,如果未通過@Bean指定bean的名稱,則默認與標注的方法名相同;
(2)、@Bean注解默認作用域為單例singleton作用域,可通過@Scope(“prototype”)設置為原型作用域;
(3)、既然@Bean的作用是注冊bean對象,那么完全可以使用@Component、@Controller、@Service、@Ripository等注解注冊bean,當然需要配置@ComponentScan注解進行自動掃描。
可以使用基于 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); } }
分析:
結果中的1:表明initMethod生效
結果中的2:表明@Scope("prototype")生效
//添加注冊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(); } }
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]); } } }
@Configuation等價于<Beans></Beans>
@Bean等價于<Bean></Bean>
@ComponentScan等價于<context:component-scan base-package="com.xxx"/>
@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(); } }
結果:
@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]); } } }
結果
配合@Configuration使用,包括 @EnableAsync, @EnableScheduling, @EnableTransactionManagement, @EnableAspectJAutoProxy, @EnableWebMvc。
@EnableAspectJAutoProxy---《spring AOP 之:@Aspect注解》
@EnableScheduling--《Spring 3.1新特性之二:@Enable*注解的源碼,spring源碼分析之定時任務Scheduled注解》
見《Spring的@PropertySource + Environment,@PropertySource(PropertySourcesPlaceholderConfigurer)+@Value配合使用》
1、@PropertySource + Environment,通過@PropertySource注解將properties配置文件中的值存儲到Spring的 Environment中,Environment接口提供方法去讀取配置文件中的值,參數是properties文件中定義的key值。
2、@PropertySource(PropertySourcesPlaceholderConfigurer)+@Value
見《Spring的@PropertySource + Environment,@PropertySource(PropertySourcesPlaceholderConfigurer)+@Value配合使用》
答案:默認情況下是非懶加載的。
Lazy表示為懶加載,當真正需要引用獲取的時候才會被加載
True 表示為非懶加載 false表示為在IOC容器加載的時候被創建
@Service @Lazy(true) public class UserService { public UserService() { System.out.println("UserService無參數構造被加載..."); } }
關于Spring5.0中Configuration注解的作用是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。