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起作用。
 
欢迎指正
posted @ 2018-03-26 21:55  CoderLynn  阅读(222)  评论(0编辑  收藏  举报