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。  默认根据类型匹配。