zoukankan      html  css  js  c++  java
  • Spring4基础 学习笔记(2) DI(依赖注入)

    DI ---- 依赖注入(Dependency Injection)

    Part One  ----  基于Xml的DI

    普通属性注入 :

    设值注入:setter方法     <property name="" value="" />
              如果注入为对象则再创建一个对象,再将property的ref设置为bean的id
    <property name="" ref="">
     
    构造注入:添加带参构造器。
              使用<constructor-arg index="从0开始计数" value=""/> 或者使用name属性
     
    p命名空间设值注入:
    添加约束:xmlns:p="http://www.springframework.org/schema/p"
    然后在bean标签内添加    -----   p:参数名称
     
    c命名空间构造注入:
    xmlns:c="http://www.springframework.org/schema/c"
    然后在bean标签内添加    ----   c:参数名称
     
    集合属性注入:在bean标签内
    1.数组赋值:
    <property name="">
         <array>
              <ref bean="">
              <ref bean="">
         </array>
    </property>
     
    2.list
    <property name="">
         <list>
              <value>value1</value>
              <value>value2</value>
          </list>
    </property>
     
    或者:
    <property name="" value="value1,value2"/>
     
    3.set
    <property name="">
         <set>
              <value>value1</value>
              <value>value2</value>
          </set>
    </property>
     
    或者:同上
     
    4.map
    <property name="">
         <map>
              <entry key="" value=""/>
              <entry key="" value=""/>
         </map>
    </property>
     
    5.properties文件
    <property name="">
         <props>
              <prop key="">value1</prop>
              <prop key="">value2</prop>
         </props>
    </property>
     
    对象的自动注入:
    <bean autowire="byName">将类的属性作为ID找bean
    <bean autowire="byType">根据类的属性的类型相同的类型(或者是子类),所以容器中该类型的bean只能有一个(包括子类)
    注:根据类型自动注入时,假设有一个类型为A的Bean,B继承A,容器中有类型A和类型B的bean,那么byType时也会出错。因为子类也能注入父类。
    SPEL(Spring Expession language)注入:
         1.配置文件中:<property name="" value="#{Persion.name}"   ----  取得id为Person的 bean 的name属性的值
                        注:需要为Persion的name属性加上getter
     
         2.<property name="" value="#{ T (java.lang.Math).random() * 50}">
     
              调用Math的random方法生成随机数
         3.<property name="" value="Persion.age > 25 ? 25 : Persion.age">
         判断age属性是否大于25,是的话按25 否则按属性值
     
         4.<property name="" value="#{Person.method()}">
         调用Persion的method方法
     
     
    为应用指定多个Spring配置文件:
    1.平等关系的配置文件:
      • 在ApplicationContext加载的时候这样加载:使用 * 来加载Spring-*
      • 使用ClassPathXmlApplicationContext的可变参构造器
                   此外可以将所有resource参数放进数组中,使用参数为数组的构造器
     
    2.包含关系的配置文件:
    在总配置文件中使用:<import resource=""/> 也能使用 * ,注意不要将自身也包含
     
    基于注解的DI:
    需要添加jar包:aop
    1)导入AOP的jar包,因为注解的后台实现用到了AOP编程
    2)需要更换配置文件头,添加相应的约束:xsd-configuration.html中
     
    //指明这个bean由容器创建,表明它是个组件,mySchool为id属性
    @Component("mySchool")
    public class School {
     
          //注入值
          @Value("工大")
          private String name;
    byType
    //自动注入:域属性赋值byName和byType两种
          @Autowired  //byType
          private School school;
     
    <!-- 组件扫描器 -->
          <!-- base-package属性指定注解类在的包 -->
          <context:component-scan base-package="annotation"></context:component-scan>
     
    byName :两个注解一起用
            @AutoWire
            @Qulifier("这里放要注入的component对象")          //
     
     
    @Resource注解也可以实现注入(JSR-250)):
         @Resource:byType
         @Resource("component的名称"):byName
     
    与@Component功能相同的注解,但是表示意义不同的三个注解:
    @Repository:注解在Dao实现类上
    @Service:注解在Service实现类上
    @Controllor:注解在控制器上
     
     
    与init-method和destory-method等效:
    @postConstruct和@destory-method
     
     
    使用javaConfig进行配置:相当于applicationContext.xml文件,使用后类  不用再注解
    使用容器创建对象,容器为java类
    @Configuration          //表示这个类将作为Spring容器来使用
    public class MyjavaConfig {
     
     
     
    @Configuration          //表示这个类将作为Spring容器来使用
    public class MyjavaConfig {
          
        // 这里配置Bean方法层级
          @Bean(name="mySchool")          //bean的id
          public School sCreator() {
                return new School("工大");
          }
    }
     
    如果需要注入对象(bean),@Bean(name="" autowire=Autowire.BY_TYPE)  //常量
    如果是BY_NAME,会将当前bean的属性名字作为ID去容器中找,所以需要配置另一个bean的name属性和当前bean的域属性相同。
     
    使用javaConfig, 类作为配置文件,new对象的时候就 传入参数,相当于注入,所以 不用再配置。
    使用javaConfig容器:还是正常使用applicationContext.xml文件,component-scan
     
     
    使用注解代替ApplicationContext对象和getBean();
    @RunWith(SpringJUnit4ClassRunner.class)         //表名以下运行环境
    @ContextConfiguration(locations="classpath:applicationContext.xml")            //配置文件,要指明在类路径下的,否则从项目根下找
    public class test {
          @Resource
          private Student student;
          
          @Test
          public void test01() {
                
                System.out.println(student);
          }
    }
     
     
    使用注解的时候不需要 setter ,不是调用setter来赋值。
    既有  注解  又有  Xml配置  文件时xml起作用。
     
    欢迎指正
  • 相关阅读:
    c#中==和equals的比较
    原型指向改变如何添加方法和访问
    把随机数对象暴露给window成为全局变量
    内置对象Array的原型对象中添加方法
    构造函数可以实例化对象
    原型
    无刷新评论
    大量字符串拼接案例
    元素隐藏占位与不占位
    导航栏切换效果案例
  • 原文地址:https://www.cnblogs.com/coderlynn/p/8654241.html
Copyright © 2011-2022 走看看