spring
spring框架理解
- spring是一个基于IOC和AOP的轻量级容器框架
spring IOC
- IOC 控制反转 : 把对象的创建权限交给spring容器管理
IOC 的实现方式
- 通过spring配置文件
<bean id="" class=""></bean>
- 基于注解的控制反转
- 在spring容器中添加标签
- 启用注解的支持,扫描指定包下的注解
<context:component-scan base-package=“包路径”/>
- 再要管理的对象的类上添加相应的注解
常用的注解有
@component :使用在非业务,非持久,非控制层
@service :使用在业务逻辑层
@repository :使用在持久层
@controller :使用在控制层
注解设置对象为多例 @scope(“prototype”)
spring DI
- 依赖注入:给Spring控制反转的对象属性注入值的过程
- 属性(Setter)注入:
一个property标签代表对象中的一个属性(Set方法)
注意: 对象必须提供无参构造方法 - 构造注入:
一个constructor-arg标签,代表构造方法中的一个参数
注意:构造方法有多少个参数,就必须提供多少个constructor-arg - 静态工厂注入
1) 类中提供一个静态方法,并返回一个对象
2) 在容器用通过 factory-method 指定该静态方法即可
实例工厂注入
1) 类中提供一个非静态方法,并返回一个对象
2) 在spring中,先配置工厂对象
3) 通过factory-bean指定工厂对象,factory-method 指定非静态方法即可
- 属性(Setter)注入:
不同数据类型的注入方式
字面量的注入方式 用 value
spring的管理的对象的注入方式用 ref
- 特殊的注入方式 用 value标签配置
- 对属性类型为数组的数据注入方式 List ,或者 value(前提是数组元素是字面量)
- 对属性类型为List的数据注入方式 List ,或者 value(前提是数组元素是字面量)
- 对属性类型为Set的数据注入方式 Set
- 对属性类型为Map的数据注入方式 map -> entry
- 对属性类型为Properties的数据注入方式 props -> prop
- 对空值的注入方式
实例
···java
public class Eg {
private User user;
private List<String> address;
private String[] tel;
private Map<String,String> zhengjian;
private Properties pro;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<String> getAddress() {
return address;
}
public void setAddress(List<String> address) {
this.address = address;
}
public String[] getTel() {
return tel;
}
public void setTel(String[] tel) {
this.tel = tel;
}
public Map<String, String> getZhengjian() {
return zhengjian;
}
public void setZhengjian(Map<String, String> zhengjian) {
this.zhengjian = zhengjian;
}
public Properties getPro() {
return pro;
}
public void setPro(Properties pro) {
this.pro = pro;
}
@Override
public String toString() {
return "Eg [user=" + user + ", address=" + address + ", tel="
+ Arrays.toString(tel) + ", zhengjian=" + zhengjian + ", pro="
+ pro + "]";
}
}
```xml
<!-- 依赖注入 -->
<!-- set -->
<bean id="user1" class="com.soft.entity.User">
<property name="id" value="2"/>
<property name="name" value="hello"/>
<property name="age" value="22"/>
</bean>
<!-- 构造器注入 -->
<bean id="user2" class="com.soft.entity.User">
<constructor-arg value="2" index="0"/>
<constructor-arg value="hello" index="1"/>
<constructor-arg value="42" index="2"/>
</bean>
<!-- 静态工厂注入 -->
<bean id="user3" class="com.soft.entity.UserFactory" factory-method="getUser"></bean>
<!-- 实例工厂注入 -->
<bean id="uf" class="com.soft.entity.UserFactory"></bean>
<bean id="user4" factory-method="getUser2" factory-bean="uf" ></bean>
<!-- 注入对象类型 -->
<bean id="eg1" class="com.soft.entity.Eg">
<property name="user" ref="user1"></property>
</bean>
<!-- 注入list类型 -->
<bean id="eg2" class="com.soft.entity.Eg">
<property name="address">
<list>
<value>河南</value>
<value>郑州</value>
</list>
</property>
</bean>
<!-- string[] -->
<bean id="eg3" class="com.soft.entity.Eg">
<property name="tel">
<list>
<value>11111111111</value>
<value>11122222222</value>
</list>
</property>
</bean>
<!-- map -->
<bean id="eg4" class="com.soft.entity.Eg">
<property name="zhengjian">
<map>
<entry value="x22223243" key="身份证"></entry>
<entry value="xert23243" key="合格证"></entry>
</map>
</property>
</bean>
<!-- Properties -->
<bean id="eg5" class="com.soft.entity.Eg">
<property name="pro">
<props>
<prop key="记者证">23244234<![CDATA[<dfd>]]></prop>
</props>
</property>
</bean>
基于注解的依赖注入
- @Value (注入字面量)
- @Resource 相当于xml中 ref
默认按照名字注入,如果名字在容器中没有找到,则按照类型注入,
如果@Resource指定了名字,则只会按照名字查找,不再按照类型注入 - @Autowired 相当于xml中 ref
默认按照名字注入,如果默认的名字在容器中没有找到,按照类型注入 - @Autowired 允许注入的对象为空,前提是必须使用 required=false
- @Autowired可以配合@Qualifier(“bean的ID”) 使用,达到和@Resource一样的效果