@Configuration与@Bean
1,@Configuration与@Bean
@Configuration:
告诉Spring这是一个配置类,配置类==配置文件。
- @Configuration==beans.xml
- 给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id。
- @Bean 等价于 <bean></bean>
- 可以给@Bean设置value来修改id,比如@Bean("personAlias")。
- 可以在@bean中指定初始化和销毁方法
@Bean(value = "beanLife",initMethod = "init", destroyMethod = "destroy") 等价于 <bean id="person" class="com.java.model.Person" init-method="init" destroy-method="destroy"></bean>
2,配置对比与验证
通常的xml配置方式如下,beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- use-default-filters若想自定义过滤器生效,则必须将该值设为false--> <!--<context:component-scan base-package="com.java" ></context:component-scan>--> <!--注入bean--> <beans> <bean id="person" class="com.java.model.Person"> <property name="id" value="11111"></property> <property name="name" value="vhsj"></property> </bean> </beans> </beans>
采用@Configuration注入方式如下
@Configuration public class BeanConfig { //@Bean @Bean("personAlias") public Person person2(){ return new Person("2222","lisi"); } }
测试代码:
public class BeanDependencyInjectionTest { public static void main(String[] args) { System.out.println("-----------------------------xml 方式注入-----------------------------------"); //xml 方式注入 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); Person person = (Person) applicationContext.getBean("person"); System.out.println("person---->"+person); //获取所有注入Bean的名称 String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames(); for (String name : beanDefinitionNames) { System.out.println(name); } System.out.println("-----------------------------annotation 注解方式注入-----------------------------------"); //annotation 注解方式注入 ApplicationContext applicationContext1 = new AnnotationConfigApplicationContext(BeanConfig.class); Person person1 = applicationContext1.getBean(Person.class); System.out.println("person1---->"+person1); //获取所有注入Bean的名称 String[] beanDefinitionNames1 = applicationContext1.getBeanDefinitionNames(); for (String name : beanDefinitionNames1) { System.out.println(name); } } }
测试结果:
-----------------------------xml 方式注入----------------------------------- person---->Person{id='11111', name='vhsj'} person -----------------------------annotation 注解方式注入----------------------------------- person1---->Person{id='2222', name='lisi'} org.springframework.context.annotation.internalConfigurationAnnotationProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor org.springframework.context.annotation.internalCommonAnnotationProcessor org.springframework.context.event.internalEventListenerProcessor org.springframework.context.event.internalEventListenerFactory beanConfig personAlias