zoukankan      html  css  js  c++  java
  • Spring IoC 依赖注入(一)使用说明

    Spring IoC 依赖注入(一)使用说明

    Spring 核心编程思想目录:https://www.cnblogs.com/binarylei/p/12290153.html

    1. 依赖注入方法

    1.1 Setter 方法依赖注入

    • 手动模式

      • XML 资源配置元信息

        <bean id="beanA" class="com.binarylei.spring.ioc.injection.BeanA">
            <property name="beanB" ref="beanB"/>
        </bean>
        
      • Java 注解配置元信息

        @Bean
        public BeanB beanB() {
            return new BeanB();
        }
        
      • API 配置元信息

        @Test
        public void testSettingInjectByApi() {
            DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
            beanFactory.registerBeanDefinition("beanB", new RootBeanDefinition(BeanB.class));
            beanFactory.registerBeanDefinition("beanA", BeanDefinitionBuilder
                                               .rootBeanDefinition(BeanA.class)
                                               .addPropertyReference("beanB", "beanB")
                                               .getBeanDefinition());
        
            BeanA beanA = beanFactory.getBean(BeanA.class);
            Assert.assertNotNull(beanA.getBeanB());
        }
        
    • 自动模式(只有 XML 配置方式,不推荐)

      • byName

        <bean id="beanA" class="com.binarylei.spring.ioc.injection.BeanA" autowire="byName"/>
        
      • byType

        <bean id="beanA" class="com.binarylei.spring.ioc.injection.BeanA" autowire="byType"/>
        

    1.2 构造器依赖注入

    • 手动模式

      • XML 资源配置元信息

        <bean id="beanA" class="com.binarylei.spring.ioc.injection.BeanA">
            <constructor-arg name="beanB" ref="beanB"/>
        </bean>
        
      • Java 注解配置元信息

        @Bean
        public BeanA beanA(BeanB beanB, BeanFactory beanFactory) {
            return new BeanA(beanB, beanFactory);
        }
        
      • API 配置元信息

        @Test
        public void testInjectConstructorByApi() {
            DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
            beanFactory.registerBeanDefinition("beanB", new RootBeanDefinition(BeanB.class));
            beanFactory.registerBeanDefinition("beanA", BeanDefinitionBuilder
                                               .rootBeanDefinition(BeanA.class)
                                               .addConstructorArgReference("beanB")
                                               .getBeanDefinition());
        
            BeanA beanA = beanFactory.getBean(BeanA.class);
            Assert.assertNotNull(beanA.getBeanB());
        }
        
    • 自动模式(只有 XML 配置方式,不推荐)

      • constructor:constructor 本质是使用 byType 进行注入

        <bean id="beanA" class="com.binarylei.spring.ioc.injection.BeanA" autowire="constructor"/>
        

    1.3 字段注入

    • 手动模式 - Java 注解配置元信息
      • @Autowired
      • @Resource
      • @Inject(可选)
    @Autowired
    private BeanB beanB;
    @Inject
    private BeanB beanB2;
    @Resource
    private BeanFactory beanFactory;
    

    引入 jsr330 maven 规范:

    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>
    

    Java EE CDI Dependency Injection (@Inject) tutorial

    1.4 方法注入

    • 手动模式 - Java 注解配置元信息
      • @Autowired
      • @Resource
      • @Inject(可选)
      • @Bean
    private BeanB beanB;
    private BeanB beanB2;
    private BeanFactory beanFactory;
    
    @Autowired
    public void init1(BeanB beanB) {
        this.beanB = beanB;
    }
    @Inject
    public void init2(BeanB beanB2) {
        this.beanB2 = beanB2;
    }
    @Resource
    public void init3(BeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }
    

    1.5 回调注入

    BeanFactoryAware ...

    public class InjectCallbackTest implements BeanFactoryAware {
        private BeanFactory beanFactory;
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) {
            this.beanFactory = beanFactory;
        }
    }
    

    2. 依赖注入类型

    2.1 基础类型注入

    • 原生类型(Primitive ): boolean、byte、char、short、int 、float、long、double
    • 标量类型(Scalar ): Number、Character、Boolean、Enum、Locale、Charset、Currency、Properties、UUID
    • 常规类型(General ): Object、String、Timezone、Calendar、Optional
    • Spring 类型:Resource、Inputsource、Formatter
    @Value("1")
    private long num;
    
    @Value("#{1 + 2}")
    private long num2;
    
    @Value("${user.dir}")
    private String userDir;
    
    @Autowired
    private Optional<Environment> environmentOptional;
    
    @Value("com/binarylei/spring/ioc/injection/spring-dependency-inject-constructor.xml")
    private Resource resource;
    

    2.3 集合类型注入

    • 数组类型(Array ):原生类型、标量类型、常规类型、 Spring 类型
    • 集合类型(Collection )
      • Collection:List、Set(Sortedset、 NavigableSet、 EnumSet)
      • Map:Properties
    @Autowired
    private Environment[] environmentArr;
    @Autowired
    private List<Environment> environmentList;
    @Autowired
    private Map<String, Environment> environmentMap;
    

    2.4 限定注入

    • 使用注解 @Qualifier 限定

      • 通过 Bean 名称限定

        @Autowired
        @Qualifier("uri2")
        private URI uri2;
        
      • 通过分组限定

        // 使用
        @Autowired
        @Qualifier
        private URI uri5;
        
        // 配置
        @Bean
        @Qualifier
        public URI uri3() {
            return URI.create("http://www.tian.com");
        }
        
        
    • 基于注解 @Qualifier 扩展限定

      • 自定义注解 - 如 Spring Cloud @Loadbalanced

        // 使用,自动按组注入
        @Autowired
        @Group1
        private URI uri3;
        
        @Autowired
        @Group2
        private URI uri4;
        
        // 配置
        @Bean
        @Primary
        @Group1
        public URI uri1() {
            return URI.create("http://www.baidu.com");
        }
        @Bean
        @Group2
        public URI uri2() {
            return URI.create("http://www.qq.com");
        }
        
        // 定义注解
        @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
        @Retention(RetentionPolicy.RUNTIME)
        @Inherited
        @Qualifier
        private static @interface Group1 {
        }
        @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
        @Retention(RetentionPolicy.RUNTIME)
        @Inherited
        @Qualifier
        private static @interface Group2 {
        }
        
        

    3. 延迟依赖注入

    • 使用注解 @Lazy 限定
    • ObjectProvider 或 ObjectFactory
    @Autowired
    private ObjectProvider<Environment> environmentObjectProvider;
    
    @Autowired
    @Lazy
    private Environment environmentLazy;
    
    

    每天用心记录一点点。内容也许不重要,但习惯很重要!

  • 相关阅读:
    Python 学习目录
    Django目录
    SQLAlchemy
    Flask之Sqlalchemy
    Websocket
    Mongodb
    虚拟环境
    Github
    LINUX
    内存管理和垃圾回收机制
  • 原文地址:https://www.cnblogs.com/binarylei/p/12318581.html
Copyright © 2011-2022 走看看