美文网首页
spring5(8)-DI 注释

spring5(8)-DI 注释

作者: 小白201808 | 来源:发表于2018-09-26 09:27 被阅读1次

    1.Autowired (Spring规范提供)&& Qualifier

    1.可以让spring自动的把属性需要的对象找出来,并注入到对象
    
    2.可以贴在字段或者setter方法上面
    
    3.可以同时注入多个对象
    
    4.可以注入一些Spring内置的重要对象,比如beanfactory,applicationcontext,servletcontext等
    
    5.默认情况下Autowired注释必须要能找到对应的对象,否者报错。通过required = false来避免这个问题
    @Autowired(required = false)
    
    6.第三方程序:在spring3.0之前,需要手动配置Autowired注释的解析器:<context:annotation-config/> ,在web开发中必须配置
    
    7.Autowired 注解寻找bean的方式
    1)首先按照依赖对象的类型找,如果找到,就用setter或者字段直接注入
    2)如果在spring上下文中寻找多个匹配的类型,再按照名字去找。如果没有匹配就报错
    3)可以通过使用@qualifier("id名")标签来规定依赖对象按照bean的id和类型的组合方式去找;
    

    代码演示

    cat类

    package com.keen.di;
    
    public class Cat {
    
    }
    
    

    person类

    package com.keen.di;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class Person {
        @Autowired  //这里使用autowired的注释就可以省去写setter方法,使用注释注入
        private Cat cat;
    
        @Override
        public String toString() {
            return "Person [cat=" + cat + "]";
        }
        
    
    }
    
    

    xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <!-- di注解解析器 -->
     <context:annotation-config/>
     
     <bean id = "cat" class = "com.keen.di.Cat"/>
     <!-- 此时 就不用再用property属性配置person中的cat了-->
     <bean id = "person" class = "com.keen.di.Person"/>
    
    </beans>
    

    test

    package com.keen.di;
    
    
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
    
    
    @SpringJUnitConfig
    public class AutoTest {
    
        @Autowired
        private Person person;
        
        @Test
        void test() throws Exception {
            System.out.println(person);
        }
        
    }
    

    2.Resource(javaEE规范,其实作用和Autowired一样,看你喜欢用哪个而已)

      1.也需要配置DI注释解析器<context:annotation-config/>
      2.recource注解必须要能找到对应的对象,否则报错
      3.recurce注释寻找bean的时候,是向按照名字去找,再按照类型去找,但如果找到多个配置类型,报错
      4.可以直接使用name属性指定bean的名称(@resource (name = ""))但是,如果指定name 就按照name去找,如果找不到就按照类型去找
    

    3.Value

     Autowired&&Resource注解用于注入对象,Value注解用于注入常量数据(简单类型数据)
     
     @Value(${server.port}")
     private int port
     
     引入配置文件
     <!-- 加载property文件 -->
    <context:property-placeholder location ="classpath:server.properties"/>
    

    注意:当加载多个配置文件时:可用逗号隔开

    <context:property-placeholder location ="classpath:server1.properties,classpath:server2.properties"/>
    

    或者:设置属性:ignore-unresolvable="true"

    <context:property-placeholder location ="classpath:server1.properties" ignore-unresolvable="true"/>
    
    
    <context:property-placeholder location ="classpath:server2.properties" ignore-unresolvable="true"/>
    

    具体代码

    ValueBean类

    package com.keen.di;
    
    import org.springframework.beans.factory.annotation.Value;
    
    public class ValueBean {
        
        //@Value ("9999")
        @Value("${server.port}")
        private int port ;
    
        @Override
        public String toString() {
            return "ValueBean [port=" + port + "]";
        }
        
    
    }
    

    server.property文件

    #key = value
    server.port = 8888
    

    xml配置文件

    ...
     <!-- 加载property文件 当加载多个文件时用逗号隔开 或者设置属性ignore-unresolvable="true" -->
     <context:property-placeholder location ="classpath:server.properties" ignore-unresolvable="true"/>
     
     <bean id ="valuebean" class = "com.keen.di.ValueBean"/>
     ...
    

    4.bean组件板型:四个组件的功能时相同的,只是用于标志不同类型的组件

      1.Component 泛指组件,但组件不好归类的时候,我们可以用这个注释进行标注
      2.Repository 用于标注数据访问的组件,即DAO 组件
      3.Service 用于标注业务层组件
      4.Controller 用于标注控制层组件(比如structs中的Action,springMVC的Contraller)
    

    注意⚠️:此时需要配置Ioc注释的解析器
    使用:

    <!--IOC注解解析器  -->
    <context:component-scan base-package=" "/>
    
    其实说白了,就是把类交给组件注释管理
    <!--IOC注解解析器  -->
    <context:component-scan base-package="com.keen.ioc"/>
    
    等同于:
    //xml配置: <bean id = "myDatasource" class = "com.keen.ioc.MyDataSource"/>
    
    

    5.初始化和销毁注解 和 scope注解

     1.postConstruct用于贴在初始化方法上面
     2.preDestory用于贴在销毁方法前面
    

    代码

    package com.keen.lifecycle;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Component;
    
    @Component
    @Scope("singleton")//默认是单例的
    public class SomeBean {
        public SomeBean() {
            System.out.println("constuctor");
        }
        @PostConstruct//构造对象之后
        public void open() {
            System.out.println("初始化方法");
        }
        @PreDestroy//销毁之前
        public void close () {
            System.out.println("销毁方法");
        }
        public void doWork() {
            System.out.println("working");
        }
    }
    
    //其实上面注解的配置作用和下面在xml配置文件代码是一样的效果
    <bean id = "someBean" class ="com.keen.lifecycle.SomeBean" scope ="singleton"
    init-method="open" destroy-method="close"/>
    

    此时我们在Xml配置文件中只需要配置解析器就可以了

    <!--IOC注解解析器  -->
    <context:component-scan base-package="com.keen.lifecycle"/>
    

    相关文章

      网友评论

          本文标题:spring5(8)-DI 注释

          本文链接:https://www.haomeiwen.com/subject/lkfdoftx.html