Spring注解驱动开发

spring注解及其使用
注解使用
@Configurationspring配置类注解
@Bean容器中注册bean,类型为返回值的类型,id默认是方法名作为id;改变名称 @Bean(value = "新名称")
@ComponentScan@ComponentScan(value = "指定扫描的包") 包扫描
 @ComponentScan(value = "com", excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})})  # excludeFilters 指定扫描的包按照什么规则排除那些组件
 @ComponentScan(value = "com", includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})}) # includeFilters 指定要扫描的包只需要包含那些组件
 

jdk8支持多个@ComponentScan,否则用@ComponentScans 包含个@ComponentScan

@ComponentScans(value = {@ComponentScan(value = "com", includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})}),@ComponentScan(value = "com", excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})})})
 @ComponentScan(value = "com",includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})})
FilterType.ANNOTATION  按照注解
 

@ComponentScan(value = "com", includeFilters = {
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {Controller.class}),//按照注解
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Person.class),//按照类型
        @ComponentScan.Filter(type = FilterType.ASPECTJ), //按照切面
        @ComponentScan.Filter(type = FilterType.REGEX), //按照正则表达式
        @ComponentScan.Filter(type = FilterType.CUSTOM, classes = {MyTypeFilter.class})//按照自定义
})

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

 

@Scope
@Scope(value = "prototype") //多实例,ioc容器启动不会调用方法创建对象在容器中,每次获取时才会调用方法创建对象
@Scope(value = "singleton")//单实例(默认值),ioc容器启动会调用方法创建对象到ioc容器,以后每次获取都是从容器(map.get())中拿
@Scope(value = "request")//同一次请求创建一个实例
@Scope(value = "session")//同一个session创建一个实例

@Bean
    public Person person() {
        return new Person();
    }

@Lazy    @Lazy//懒加载,容器启动的时候不创建实例,第一次获取的时候才会创建对象
    @Bean
    public Person person() {
        return new Person();
    }
@Conditional
  /**
     * 注入满足LinuxCondition条件的实例
     * @return
     */
    
    @Bean(value = "zhangsan")
    @Conditional(value = {LinuxCondition.class})
    public Person zhangSan() {
        return new Person("zhangsan",61);
    }
    /**
     * 注入满足WindowCondition条件的实例
     * @return
     */
    @Bean(value = "lisi")
    @Conditional(value = {WindowCondition.class})
    public Person lisi() {
        return new Person("lisi",61);
    }


/**
 * 设置linux条件
 */
public class LinuxCondition implements Condition {
    /**
     *
     * @param conditionContext  上下文信息
     * @param annotatedTypeMetadata  注释信息
     * @return
     */
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //获取ioc容器使用的beanFactory
        ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
        //获取类加载器
        ClassLoader classLoader = conditionContext.getClassLoader();
        //获取运行环境信息
        Environment environment = conditionContext.getEnvironment();
        //获取bean的注册类信息
        BeanDefinitionRegistry registry = conditionContext.getRegistry();

        String property = environment.getProperty("os.name");
        if(property.contains("linux")) {
            return true;
        }
        return false;
    }
}


/**
 * 设置window条件
 */
public class WindowCondition implements Condition {
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {

        Environment environment = conditionContext.getEnvironment();
        //获取当前运行环境
        String property = environment.getProperty("os.name");
        if(property.contains("Window")) {
            return true;
        }
        return false;
    }
}


 /**
     * 调试方法
     * @param args
     */
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        String[] beanNamesForType = applicationContext.getBeanNamesForType(Person.class);
        for(String beanName: beanNamesForType) {
            System.out.println("beanName = " + beanName);
        }

    }

//运行结果

beanName = lisi

@Conditional  加在方法上,满足条件方法才会执行,加在类上,满足条件类中内容才会生效

设置运行环境

@Import
@Configuration
@Import({Color.class, Blue.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
/**
 * 给容器中注册组件
 * 1)包扫描+组件标注注解(@ComponentScan/@Controller/@Service/@Component) 本项目中组件
 * 2)@Bean[导入第三方包里面的组件]
 * 3) @Import[快速给容器中导入一个组件]
 *     1)@Import(要导入到容器中的组件),容器中就会自动注册这个组件,id默认是全类名
 *     2)ImportSelector: 返还要导入的组件的全类名数组
 *     3)ImportBeanDefinitionRegistrar:手动注入bean到容器中
 *  4)、使用Spring提供的FactoryBean(工厂Bean)
 *    1)、默认获取到的是工厂bean调用getObject创建的对象
 *    2)、要获取工厂Bean本身,我们需要给id前面加一个&HelloBeanFactory
 */
public class ConfigImport {
    @Bean
    public HelloFactoryBean helloFactoryBean() {
        return new HelloFactoryBean();
    }
}



public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"com.zhang.imports.Color"};
    }
}


public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        //指定bean名
        boolean red = beanDefinitionRegistry.containsBeanDefinition("red");
        if (!red) {
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Red.class);
            beanDefinitionRegistry.registerBeanDefinition("red", rootBeanDefinition);
        }
    }
}


public class HelloFactoryBean implements FactoryBean{

    @Override
    public Color getObject() throws Exception {
        return new Color();
    }

    @Override
    public Class<?> getObjectType() {
        return Color.class;
    }

    /**
     * 是否单利
     * @return
     */
    @Override
    public boolean isSingleton() {
        return true;
    }
}

 

初始化与销毁
/**
 * bean的生命周期
 *    bean创建-------初始化---销毁的过程
 * 容器管理bean的生命周期
 * 我们可以自动以初始化和销毁方法,容器在bean进行到当前生命周期的时候调用我们自定义的初始化和销毁方法
 *
 * 构造(创建对象)
 *  单实例(singleton):在容器启动的时候创建对象
 *  多实例(prototype):在每次获取的时候创建对象
 *
 *  初始化:
 *        对象创建完成,并赋值好,调用初始化方法
 *  销毁:
 *        单实例:容器关闭时候
 *        多实例:容器不会管理这个bean,容器不会调用销毁方法
 *
 * 1)、指定初始化和销毁方法
 *     通过@Bean指定init-method和destroy-method

 * 2)、提供给Bean实现InitializingBean(定义初始化逻辑),
 *      DisposableBean(定义销毁逻辑)

 * 3)、可以通过JSR250
 *      @PostConstruct,在bean创建完成并且属性赋值完成,执行初始化方法
 *      @PreDestroy,在容器销毁bean之前,执行销毁逻辑
     
 *  4)、BeanPostProcessor[interface],bean的后置处理器
 *      在bean初始化前后进行一些处理工作
 *      postProcessBeforeInitialization:在初始化之前工作(ps:在1,2,3init之前)
 *      postProcessAfterInitialization:在初始化之后工作(ps:在1,2,3init之后)
 *
 */
public class CatInitDestroy {
    public CatInitDestroy() {

    }

    public void init() {
        System.out.println("cat .........init ");
    }

    public void destroy() {
        System.out.println("cat .........destroy ");
    }
}

@Configuration
public class ConfigInitDestroy {

    @Bean(initMethod = "init",destroyMethod = "destroy")
    public CatInitDestroy cat() {
        return new CatInitDestroy();
    }
}



@Component
public class CatInitBeanDispose implements InitializingBean, DisposableBean {

    public void afterPropertiesSet() throws Exception {
        System.out.println("cat .........init ");
    }

    public void destroy() throws Exception {
        System.out.println("cat .........destroy ");
    }
}



@Component
public class CatPostPre  {
    @PostConstruct
    public void init() {
        System.out.println("cat .........init ");
    }

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


/**
 *
 * 初始化前后进行处理
 *
 */
@Component
public class CatBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

 

@Autowired
@Autowired,自动注入。
  1).默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class );
  2).如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找:applicationContext.getBean("bookDao")
  3).@Qualifier("bookDao"),使用@ Qualifier指定需要装配的组件的id,而不是使用属性名
  4). 自动装配默认一定要将属性赋值好,没有就会报错
       可以使用@Autowired(required = false);
  5)@Primary 让spring默认使用首选的bean
spring还支持使用@Resource(JSR250)@Inject(JSR330)[java规范的注解]
         @Resource
            可以和@Autowired一样实现自动装配功能,默认是按照注解名称进行装配的
                没有支持@Primary功能,没有支持@Autowired(required=false)
         @Inject(JSR330)
             需要导入javax.inject 包,和Autowired的功能一样,没有required=false
AutowiredAnnotationBeanPostProcessor:解析完成自动配置装配功能:

3)@Autowired:构造器、参数、方法、属性;都是从容器中获取参数组件的值

1)[标注在方法位置]@Bean+方法参数:参数从容器中获取;默认不写@Autowried效果是一样的;都能自动装配
 2)[标在构造器上]:如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件
 3)放在参数位置
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值