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起作用。
欢迎指正