IOC容器设计理念与核心注解的使用

一、IOC容器设计理念 依赖倒置原则。
    <1>ioc的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。 
        第一,资源集中管理,实现资源的可配置和易管理。
        第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。    
    <2>BeanFacotry的bean是延时加载的,ApplicationContext是非延时加载的
二、spring IOC容器底层注解使用。
<1>基于读取配置类的形式定义Bean信息
@Configuration 配置类注解类似xml文件
@Bean 可以通过value给bean定义name
@ComponentScan 
    包扫描: basePackages = {"包的路径"}
    排除用法: 
    excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class}),
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = {TulingService.class})
    }
    包含用法: 需要把useDefaultFilters属性设置为false, 
    includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class, Service.class})
    },useDefaultFilters = false

    @ComponentScan.Filter  type的类型(常用)
        a)注解形式的FilterType.ANNOTATION    
              @Controller  @Service  @Repository  @Compent
        b)指定类型的 FilterType.ASSIGNABLE_TYPE 
              @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = {TulingService.class})
        c)自定义 FilterType.CUSTOM

public class TestFilterType implements TypeFilter {
     @Override
     public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
            //获取当前类的注解信息
           AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
           //获取当前类的class的源信息
           ClassMetadata classMetadata = metadataReader.getClassMetadata();
           //获取当前类的资源
           Resource resource = metadataReader.getResource();
           if(classMetadata.getClassName().contains("Dao")){
               return true;
           }
           return false;
    }
 }


<2>、配置Bean的作用域对象
    a、在不指定@Scope的情况下,所有的bean都是单实例的bean,而且是饿汉加载(容器启动实例就创建好了)
        <1>singleton 默认单例 
        <2>prototype 多例 IOC容器启动的时候,并不会创建对象,而是在第一次使用的时候才会创建
    b、@Lazy 主要针对单实例的bean 容器启动的时候,不创建对象,在第一次使用的时候才会创建该对象
<3>、IOC 容器中添加组件的方式
    a、@CompentScan +@Controller @Service @Respository  @compent
    b、@Bean
    c、@Import
<4>、Bean的初始化方法和销毁方法.
    @Bean(initMethod = "init",destroyMethod = "destroy")
    针对单实例bean的话,容器启动的时候,bean的对象就创建了,而且容器销毁的时候,也会调用Bean的销毁方法
    针对多实例bean的话,容器启动的时候,bean是不会被创建的而是在获取bean的时候被创建,而且bean的销毁不受IOC容器的管理
<5>、组件赋值 @Value  + @PropertySource
     @Value("值")  @Value("#{28-8}")   @Value("${person.lastName}")  @PropertySource(value = {"classpath:person.properties"})
     注意:
         Spring @Value解析${} ,需要手动在配置类声明一个STATIC PropertySourcesPlaceholderConfigurer bean

 @Bean
 public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
       return new PropertySourcesPlaceholderConfigurer();
 }


<6>、自动装配
    @AutoWired  可以标注在成员变量 set方法 及构造方法上
    自动装配首先时按照类型进行装配,若在IOC容器中发现了多个相同类型的组件,那么就按照属性名称来进行装配
    如果容器中没有,则会抛出异常 No qualifying bean of type 'xxx' available
    若想不抛异常 ,我们需要指定 required为false的时候可以了 @Autowired(required = false)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值