• Spring注解驱动开发之IOC


    1、最简单的注解驱动开发实例:

          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context</artifactId>
              <version>4.3.8.RELEASE</version>
          </dependency>
    public class Student {
        String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public void print(){
            System.out.println("student :" + name);
        }
        public Student() {
            System.out.println("student构造器");
        }
    }
    
    @Configuration
    public class Config {
        @Bean
        public Student student(){
            System.out.println("创建student对象");
            Student s = new Student();
            s.setName("yaohuiqin");
            return s;
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext annotationConfigApplicationContext=new AnnotationConfigApplicationContext(Config.class);
            Student s= (Student) annotationConfigApplicationContext.getBean(Student.class);
            System.out.println(s.getName());
            String[] strings=annotationConfigApplicationContext.getBeanDefinitionNames();
            for(String ss:strings){
                System.out.println(ss);
            }
        }
    }

    2、@ComponentScan注解 自动扫描  @Controller  @Service @Repository @Component

    FilterType.ANNOTATION:按照注解
    FilterType.ASSIGNABLE_TYPE:按照给定的类型
    FilterType.CUSTOM :自定义类型
    <context:component-scan base-package="com.test.spring"></context:component-scan>
    @Configuration
    @ComponentScan(value = "com.test.spring.config",includeFilters={
            @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class),
            @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = Service.class)
    },useDefaultFilters =false)
    public class Config {
    
    }
    
    public class MyTypeFilger implements TypeFilter {
        /**
         *
         * @param metadataReader 扫描到的当前的类的信息
         * @param metadataReaderFactory 可以获取其他类的信息
         * @return
         * @throws IOException
         */
        @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();
            System.out.println("测试"+className);
            if(className.contains("er"))return true;
            return false;
        }
    }
    @Configuration
    @ComponentScan(value = "com.test.spring.config",includeFilters={
    @ComponentScan.Filter(type = FilterType.CUSTOM,classes = MyTypeFilger.class)
    },useDefaultFilters =false)
    public class config {
      
    }

    3、@Scope(value = "singleton")

    singleton、prototype、request、session
    @Lazy懒加载

    4@import(快速给容器导入一个组件)

    @Import(value = {MyImportBeanDefinitionRegistrar.class,Dao.class})
    value值可以是bean的类,
    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            BeanDefinition beanDefinition = new RootBeanDefinition(ByBeanDefinitionRegistrar.class);
            registry.registerBeanDefinition("ByBeanDefinitionRegistrar123",beanDefinition);
        }
    }
    
    public class MyImportSelector implements ImportSelector {
        @Override
        public String[] selectImports(AnnotationMetadata importingClassMetadata) {
            return new String[]{"com.test.spring.config.Dao","com.test.spring.config.Service"};
        }
    }

    5、@conditional使用实例

    @Configuration
    public class config2 {
    
        @Conditional(value = Linuxcondition.class)
        @Bean
        public Person yaohuiqin(){
            System.out.println("创建Person:yaohuiqin对象");
            Person s = new Person();
            s.setName("yaohuiqin");
            return s;
        }
    }
    
    public class Linuxcondition implements Condition  {
    
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
            ClassLoader classLoader = context.getClassLoader();
            Environment environment = context.getEnvironment();
            String currentOs = environment.getProperty("os.name");
            System.out.println(currentOs);
            if(currentOs.contains("Windows"))return true;
            return false;
        }
    }

    6、实现FactoryBean接口

    public class NextDate implements FactoryBean {
        @Override
        public Object getObject() throws Exception {
            Date date = new Date();
            Calendar calendar = new GregorianCalendar();
            calendar.setTime(date);
            calendar.add(Calendar.DATE, 1);
            date = calendar.getTime();
            return date;
        }
        @Override
        public Class<?> getObjectType() {
            return Date.class;
        }
        @Override
        public boolean isSingleton() {
            return false;
        }
    }

    7、指定初始化方法和销毁方法

    @Bean(initMethod = "init",destroyMethod = "destory")    初始化和销毁方法指定。初始化方法是在对象创建完成并赋完值,则调初始化方法。销毁方法是在容器销毁时调用。

    @PostConstruct

    @PreDestroy 

    public class MyCat implements InitializingBean,DisposableBean {
        String name;
        public MyCat() {
            System.out.println("MyCat构造器");
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            System.out.println("设置属性");
            this.name = name;
        }
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("MyCat---InitializingBean----afterPropertiesSet()");
        }
        @Override
        public void destroy() throws Exception {
            System.out.println("DisposableBean---DisposableBean---destroy()");
        }
    }

    8、BeanPostProcessor接口

    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

    源码:

    protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
    throws BeanCreationException {
    populateBean(beanName, mbd, instanceWrapper);   //给bean进行属性赋值
    if (exposedObject != null) {
    exposedObject = initializeBean(beanName, exposedObject, mbd);
    }
    }

    
    

    9、@Value赋值
      值,#{},${}        #{20-2}

     <context:property-placeholder location="jdbc.properties"></context:property-placeholder>
    等价于在配置类上写:@PropertySource( value = "jdbc.properties")

    10、自动装配

      @Autowired 优先使用类型去自动装配,如果存在多个,则将属性的名字作为id去查找装配。

      指定装配:

        @Qualifier("myDao2")
        @Autowired
        MyDao myDao3;
     装配时首选装配:
        @Primary
      找不到就不装配 :
        @Autowired(required = false)
    
    
  • 相关阅读:
    centos6和centos7升级openssh7.5脚本
    开通telnet服务,使用telnet登入
    彻底删除kafka的topic以及其中的数据
    redis集群创建
    curl 命令参数
    nginx.conf配置文件详解,白嫖的
    logstash迁移es数据
    es 常用查询
    pl/sql 存储过程
    es查看集群信息命令_cat和_cluster
  • 原文地址:https://www.cnblogs.com/yaohuiqin/p/9961900.html
Copyright © 2020-2023  润新知