1 Spring的IOC理解
Spring IOC 思想的理解:
Inversion of Control 控制反转,就是把对象的创建权交给Spring。一般情况下,一个类要依赖另一个类的对象的时候,我们就会在这个类中new一个被依赖的对象。比如现在有一个Service,为了实现对数据库的操作,Service要依赖Dao,传统方式下,我们会在Service中new一个Dao的对象,这个时候,创建Dao对象的控制权在Service自己手中,而Spring就是一个管理Bean对象的容器,任何对象都可又Spring进行创建和管理,其他类的对象如果想要获得哪个Bean对象的会,可以直接从Sping容器中获取,而不需要自己去new来创建一个对象,因而创建对象的方式反转了,由原来的自己创建到由Spring创建,这就是IOC思想。
1.1 将bean的创建权利交由Spring来管理
现在在com.sitech.model包下有一个User.java类,要将User对象的创建权交由Spring,并由Spring容器来管理User对象,需要在Spring的配置文件中进行如下配置:其中name就相当与User user = new User()中的user对象的引用,class是User对象的完整类名(包名.类名)。
<bean name="user" class="com.sitech.model.User"></bean>
<!--或者如下配置,id和name的作用一,只是id不能重复,且不能使用特殊字符-->
<bean id="user" class="com.wu.model.User"></bean>
1.2 Spring的DI(依赖注入)方式
要实现IOC思想就需要有DI做技术上的支持,依赖注入就是将其依赖对象的属性值注入到其对应的属性上。
常用的属性DI(依赖注入)的方式:
set方法注入:现在为user对象的name属性和age属性注入值。property的name属性指定要注入的属性名称,value指定该属性名称所要注入的值。
<bean id="car" class="com.wu.model.Car"></bean>
<bean name="user" class="com.wu.model.User">
<!--值类型的注入-->
<property name="name" value="tom"></property>
<property name="age" value="20"></property>
<!--引用类型的注入,前提是该引用的对象已经在Spring中配置过了,由Spring容器管理-->
<property name="car" ref="car"></property>
</bean>
构造方法的注入:
public User{
private String name;
private int age;
Car car;
User(String name,Car car){
this.name=name;
this.car=car;
}
User(Car car,String name){
this.name=name;
this.car=car;
}
get,set....
}
<bean id="car" class="com.wu.model.Car"></bean>
<!--调用第一个构造方法-->
<bean id="user" class="com.wu.model.User">
<constructor-arg name="name" index="0" type="java.lang.String" value="tom"/></constructor-arg>
<constructor-arg name="car"index="1" ref="car"/></constructor-arg>
</bean>
字段注入
依赖注入的类型:
值类型的注入:
<bean id="car" class="com.wu.model.Car"></bean>
<bean name="user" class="com.wu.model.User">
<!--值类型的注入-->
<property name="name" value="tom"></property>
<property name="age" value="20"></property>
<!--引用类型的注入,前提是该引用的对象已经在Spring中配置过了,由Spring容器管理-->
<property name="car" ref="car"></property>
</bean>
复杂类型的注入:
<bean id="car" class="com.wu.model.Car"></bean>
<bean name="collectionBean" class="com.wu.model.CollectionBean">
<!--数组的注入,多个元素注入。假设CollectionBean类中有一个Sring[] arr数组-->
<property name="arr">
<array>
<value>tom</value>
<value>lisi</value>
<ref bean="user4"/>
</array>
</property>
<!--List集合的注入,多个元素注入。假设CollectionBean类中有一个List list集合-->
<property name="list">
<list>
<value>tom</value>
<value>lisi</value>
<ref bean="user4"/>
</list>
</property>
<!--Map的注入,多个元素注入。假设CollectionBean类中有一Map map-->
<property name="map">
<map>
<entry key="name" value="tom"></entry>
<entry key-ref="user4" value-ref="user2"></entry>
</map>
</property>
<!--Properties类型的注入,多个元素注入。假设CollectionBean类中有一个Properties pop-->
<property name="pop">
<props>
<prop key="username">tom</prop>
<prop key="password">123</prop>
</props>
</property>
</bean>
1.3 bean的scope属性(bean的作用范围)
singleton:默认值,单例的。被标示为单例的bean对象在Spring容器中只存在一个。
prototype:多例原形,被标示为多例的bean对象在每次都获得的时候都会被创建,每次创建的都是新的对象。
request:被标示额为request对象的生命周期与web环境下的request的生命周期一致。
session:被标示额session对象的生命周期与web环境下的session的生命周期一致。
globalSession:应用在Porlet环境。如果没有Porlet环境那么globalSession相当于web环境下的session。
1.4 bean的生命周期配置
通过配置<bean>标签上的init-method属性作为Bean的初始化的时候执行的方法,配置 destroy-method属性作为Bean的销毁的时候执行的方法。
销毁方法想要执行,需要是单例创建的Bean而且在工厂关闭的时候,Bean 才会被销毁。
先假设User类中有一个init()方法和一个destroy()方法,init()方法 需要在User对象创建初始化的时候执行,destroy()方法需要在User对象销毁的时候执行,则可以在Spring中进行如下配置:
<!--空参构造创建方式-->
<bean name="user" class="com.sitech.model.User"
init-method="init" destroy-method="destroy"></bean>
1.5 Spring对象的创建方式
空参的构造方式:
<!--空参构造创建方式-->
<bean name="user" class="com.wu.model.User"></bean>
静态工厂:factory-method="getUser"表示由静态工厂的getUser方法创建User对象。
//静态工厂类
public class UserFactory{
//静态的getUser方法创建User对象
public static User getUser(){
return new User();
}
}
<!--静态工厂创建方式-->
<bean name="user2" class="com.wu.model.User" factory-method="getUser"></bean>
实例工厂:
//实例工厂类
public class UserFactory{
//getUser实例方法创建User对象
public User getUser(){
return new User();
}
}
<!--首先将实例工厂类交由Spring容器管理,再由实例工厂创建方式,-->
<bean id="user3Factory" class="com.wu.model.UserFactory"></bean>
<bean id="user3" factory-bean="user3Factory" factory-method="getUser()"></bean>
2 Spring注解
配置扫描注解。
<!--Spring 的注解开发:组件扫描,扫描com.wu.model包下以及所有子孙包下的类--->
<context:component-scan base-package="com.wu.model">
@Component:组件,作用在类 上,可以直接使用属性注入的注解。它有三个衍生注解:@Controller :用于WEB 层、 @Service :用于业务层、@Repository :用于持久层。
@Value :用于注入普通类型。
//通过反射方式,破坏了封装性。
@value("tom")
private String name;
//通过set方法赋值,推荐使用
@value("tom")
public void setName(String name){
this.name=name;
@Autowired :自动装配,默认按类型进行装配。按名称注入: @Qualifier强制使用名称注入。
@Resource :相当于@Autowired 和@Qualifier 一起使用。
@Scope:bean的生命周期.@Scope(scopeName="singleton"):单例;@Scope(scopeName="prototype"):多例。
@PostConstruct :相当于 init-method。
@PreDestroy :相当于 destroy-method。
@RunWith:运行器,@RunWith(SpringJUnit4ClassRunner.class):让测试运行于Spring测试环境。
@ContextConfiguration:指定创建容器时,使用哪个配置文件。