Spring是一个开源的控制反转(Inversion of Control)和面向切面(AOP)的的容器框架,目的是简化企业开发。
public PresonServiceBean{
private PersonDao personDao = new PersonDaoBean();
public void save(Person person){
personDao.save(person);
}
}
上面代码可以看出,PersonDaoBean是在应用内部创建及维护的,IOC即为应用本身不负责依赖对象的创建和维护,依赖对象的创建和维护是由外部容器(Spring或其他Framework)负责的,这样控制权由应用交给了外部容器,即为控制反转。
依赖注入(Dependency Injection):在运行期,有外部容器动态地将依赖对象注入到组件中
当把依赖对象交给外部容器负责创建,则PersonServiceBean类可以改写成以下方式
public PersonServiceBean{
private PersonDao personDao;
//通过构造器参数,让容器把创建好的依赖对象注入进PersonServicebean,也可以使用Setter方法
public PersonServiceBean(PersonDao personDao){
this.personDao=personDao;
}
public void save(Person person){
personDao.save(person);
}
}
使用Spring的优势:
1.解耦合,实现分层解耦:Controller–Service–Dao(在原来的代码中服务层 PresonServiceBean类中直接使用了Dao层的对象,两层之间是紧密耦合的)
2.可以使用Spring提供的众多服务:事务管理服务,持久化服务,JMS服务
//使用Spring事务管理服务则不需要手动控制事务也不需处理复杂的事务传播,即beginTransaction和commit这两行代码可省略
public void testSave() throws Exception {
Session session = sessionFactory.openSession();
session.beginTransaction();
for (int i = 1; i <= 20; i++) {
User user = new User();
user.setName("aaa_" + i);
user.setAddress("bbb_" + i);
session.save(user);
}
session.beginTransaction().commit();
session.close();
}
3.容器可以实现单例模式支持,开发人员不需要自己编写实现代码
4.提供了AOP技术,很容易实现权限拦截、运行期监控等
5.提供了很多辅作类,使用这些类可以加快开发,如JDBC Template(对JDBC进行了封装)、Hibernate Template
6.Spring对于主流的应用框架提供了集成支持,集成hibernate、JPA、Struts2等,便于应用开发
轻量级和重量级框架:
区分:看他使用了多少服务,使用服务越多,容器要为普通的java对象做的工作越多,会影响发布时间或运行性能
在Spring中,提供了多种服务,但默认不是打开的,应用需要使用某种服务,就需要指明使用该服务,如果只使用Spring的核心服务,则Spring为轻量级,若使用Spring提供的大部分服务,则为重量级;在EJB中,默认为应用提供了EJB规范中的所有功能,即为重量级。
环境搭建–实例化Spring容器(两种方式)
1.在类路径下寻找配置文件来实例化容器
2.在文件系统路径下寻找配置文件来实例化容器(不常用,系统文件路径不同)
Spring的配置文件可指定多个,可通过String数组传入
Spring实例化bean的三种方式: 推荐使用第一种方式,配置简单
1.使用类构造器实例化
<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean">
2.使用静态工厂方法实例化
<bean id ="personService" class="cn.itcast.service.OrderFactory" factory-method="createOrder"/>
public class orderFactory{
public static OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
3.使用实例工厂方法实例化
<bean id ="personServiceFactory" class="cn.itcast.service.OrderFactory" />
<bean id ="personService" factory-bean="personServiceFactory" factory-method="createOrder" />
public class OrderFactory{
public OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
配置bean的作用域:
1.默认情况下bean交给Spring管理后,是单实例的
@Test
public void instanceSpring() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
PersonService personService1 = (PersonService)ctx.getBean("personService");
PersonService personService2 = (PersonService)ctx.getBean("personService");
// personService.save();
System.out.println(personService1==personService2);
//输出为true代表引用的是同一个对象
}
2 .singleton:
在每个Spring IOC容器中一个bean定义只有一个对象实例。默认情况下,在容器启动时初始化bean,但可指定bean节点中lazy-init=“true”来延迟初始化bean;这时候只有第一次获取bean时才会初始化bean,如:
<bean id ="xxx" class="yyy" lazy-init="true"/>
如果想对所有bean都是用延迟初始化,可以在根节点beans中设置default-lazy-init=“true”
<beans default-lazy-init="true"...>
.
.
.
</beans>
3 .prototype:每次从容器获取bean都是新的对象
<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean" scope="prototype">
管理bean的生命周期:
使用lazy-init=”true”来控制bean初始化–true为延迟初始化
引用一篇文章(侵删):Bean的生命周期