spring注解开发-02

容器的初始化及销毁的方式

1、使用initMethod和destroyMethod方式进行指定

@Configuration
@ComponentScan(basePackages = {"com.atguigu.pojo"})
public class ConfigrationByProtoType {

    /**
     * init-method : 配置初始化的方法
     * destory-method: 配置销毁的方法
     */
    @Bean(initMethod = "init" , destroyMethod = "destroy")
    public Color color(){
        return new Color();
    }
}
  • Color类:

      public class Color {
    
          public Color(){
              System.out.println("Color无参构造方法执行了...");
          }
      
          public void init(){
              System.out.println("color...init....");
          }
      
          public void destroy(){
              System.out.println("color...destroy....");
          }
      
          @Override
          public String toString() {
              return "Color{}";
          }
      }
    

2、在具体的pojo或者要加入容器对应的对象中,在初始化方法上面加入@PostConstruct,在销毁对应的方法上加入@PostDestroy即可

@Component
public class Dog {

    public Dog(){
        System.out.println("Dog无参方法执行了...");
    }

    @PostConstruct
    public void init(){
        System.out.println("dog...init...");
    }

    @PreDestroy
    public void destroy(){
        System.out.println("dog...destroy...");
    }
}

3、实现BeanPostProcessor接口

@Component
public class Cat implements BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization..." + beanName);
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization..." + beanName);
        return bean;
    }
}
/**
 执行的顺序是:
 *          1、无参构造
 *          2、执行postProcessBeforeInitialization方法;
 *          3、执行初始化方法;
 *          4、执行postProcessAfterInitialization方法;
*/

属性注入

  • 配置类:

      @Configuration
      @PropertySource(value = {"classpath:/person.properties"})
      public class ConfigrationByValue {
      
          @Bean
          public Person person(){
              return new Person();
          }
      }
    
  • Person类:

      public class Person {
      
      	@Value("${person.my.name}")
      	private String name;
      
      	@Value("${person.my.age}")
      	private String age;
      	//省略getter、setter、无参构造、有参构造、toString
      	}
    
  • 配置文件(person.properties)

      person.my.name=yuhai
      person.my.age=22
    
  • 注意事项

            @Value("余海") 可以写固定值
           * @Value("#{18*2}") 可以写SPEL表达式
           * @PropertySource(value = {"classpath:/person.properties"}) 标注在类上,作用是读取外部配置文件
           * @Value("${...}") 读取配置文件中配置的key,相当于map.get
    

当一个接口存在多个实现类时

  • 配置类

      @Configuration
      @ComponentScan(basePackages = {"com.atguigu.service"})
      public class ConfigrationByProtoType {
      
          @Bean("userMapper2")
          public UserMapper userMapper(){
              return new UserMapper("李静");
          }
      }
    
  • service类:

      @Service
      public class UserService {
      
          @Qualifier("userMapper2")
          @Autowired
          private UserMapper userMapper;
      
          @Override
          public String toString() {
              return "UserService{" +
                      "userMapper=" + userMapper +
                      '}';
          }
      }
    
  • mapper类:

      @Repository
      public class UserMapper {
      
          private String name = "yuhai";
      
          public UserMapper() {
          }
      
          public UserMapper(String name) {
              this.name = name;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          @Override
          public String toString() {
              return "UserMapper{" +
                      "name='" + name + '\'' +
                      '}';
          }
      }
    
  • 注意事项

      /**
           * @Autowired默认是按照类型装配,当要调用的接口存在多个实现类时,
           * 1、名称注入,属性名称与注册到IOC的容器名称保持一致;
           * 2、使用@Qualifier("...")指定需要导入的容器
           * 3、使用@Primary注解把容器当中的接口实现指定为主要的
           * 4、若注入的属性,非必须,可以添加一个require=false的属性指定
           */
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值