• Spring8——Bean的生命周期、自动装配


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

      

      

  • 相关阅读:
    Python实例 包机制
    Python实例 类和继承
    python实例 文件处理
    python实例 异常处理
    配置 Apache+php多端口多站点(转载)
    C#中Delegate和Event以及它们的区别(转载)
    LINQ to SQL更新数据库操作(转载)
    创业公司如何实施敏捷开发(转)
    利用ps橡皮擦工具快速抠图
    XP win2003系统 微软雅黑字体的使用方法
  • 原文地址:https://www.cnblogs.com/ghlz/p/13191808.html
Copyright © 2020-2023  润新知