Bean的生命周期
创建、初始化(赋初值)、使用、销毁。
方法一:@Bean+返回值方式
init destory
<bean id="student" class="org.ghl.entity.Student" scope="singleton" init-method="myInit" destroy-method="myDestory"> <property name="stuNo" value="4"></property> <property name="stuName" value="df"></property> <property name="stuAge" value="34"></property> </bean>
注解方式:
@Bean(value = "stu",initMethod = "myInit",destroyMethod = "myDestory")
总结:IOC容器在初始化时,会自动创建对象(即生成构造方法),再初始化init,当容器关闭时调用destory。
方法二:
三层注解(包括功能性注解,eg:转换器,使用@Component):@Controller,@Service,@Dao,@Component;
三层组件:扫描器+三层注解;
JAVA规范:JSR250。
@PostConstruct:相当于init
@PreDestory:相当于destory
@Component(value = "myConvert") public class MyIntToStringConverter { //初始化 @PostConstruct public void init(){ System.out.println("转换器...init..."); } public void myConverter(){ System.out.println("转换器..."); } //销毁 @PreDestroy public void destory(){ System.out.println("转换器...destory..."); } }
过程:将相应的组件加入@Conponent注解,Bean的名字是value值,初始化方法加 @PostConstruct,销毁方法加@PreDestroy。
方法三:
接口:适用于三层组件。
InitializingBean:初始化
DisposableBean:销毁
@Component public class MyFunction implements InitializingBean,DisposableBean{ @Override public void afterPropertiesSet() throws Exception { System.out.println("Function...init"); } public void Function(){ } @Override public void destroy() throws Exception { System.out.println("Function...destory"); } }
方法四:一个接口(给容器中所有bean加初始化和销毁)
接口:适用于三层组件。
BeanPostProcessor:拦截了所有容器中的bean
@Component public class MyFourth implements BeanPostProcessor{ //拦截 @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("初始化:"+beanName+":"+bean); System.out.println("MyFourth...init"); if (bean instanceof Student){ Student stu=(Student)bean; stu.setStuName("sadafdf"); stu.setStuNo(234); return stu; } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("销毁:"+beanName+":"+bean); System.out.println("MyFourth...destory"); return bean; } }
自动装配
@AutoWired
三层组件:
Controller--->Service--->Dao
通过@AutoWired从IOC容器中根据类型自动注入(没有调用set方法)。
-@AutoWired可以加在属性前也可以加在set方法前;
-不能放在方法的参数前。
@Autowired //从IOC容器中寻找一个类型为StudentDao的Bean(根据类型) private StudentDao studentDao;
@Bean+返回值方式:
@AutoWired:在方法前(特殊情况:如果只有一个有参构造方法,则可以省略 @AutoWired);
能放在方法的参数前(可以省略)。
@AutoWired根据类型自动装配问题:
三层注解形式/@Bean+返回值形式:
如果有多个类型相同的,会报错,可以指定默认,加@Primary。
通过@Qualifier("studentDao")和@Autowired可以实现根据名字注入。
如果有0个类型相同,默认报错,可以通过@Autowired(required = false)修改。
自动注入方法一:@AutoWired(Spring) 默认根据类型;
自动注入方式二:@Resource(JSR250) 默认根据名字(若有名字,则根据名字匹配;若没有名字,则先找名字,找不到,再根据类型查找)。也可以通过name或type属性指定根据名字或类型找;
自动注入方式三:@Inject 需要额外引入Javax Inject。 默认根据类型匹配。