- Spring是什么
Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目得是简化企业开发.
- IOC控制反向
所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转.

public class PersonServiceBean { private PersonDao personDao = new PersonDaoBean(); public void save(Person person){ personDao.save(person); } }
- 依赖注入(Dependency Injection)
所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中,当我们把依赖对象交给外部容器负责创建,那么PersonServiceBean类可以改成如下:

public class PersonServiceBean { private PersonDao personDao ; //通过构造器参数,让容器把创建好的依赖对象注入进PersonServiceBean,当然也可以使用setter方法进行注入。 public PersonServiceBean(PersonDao personDao){ this.personDao=personDao; } public void save(Person person){ personDao.save(person); } }
- 为何要使用Spring
- 降低组件之间的耦合度,实现软件各层之间的解耦
- 可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播
- 容器提供单例模式支持,开发人员不再需要自己编写实现代码
- 容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能
- 容器提供的众多辅作类,使用这些类能够加快应用的开发,如:JdbcTemplate、HibernateTemplate
- Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发
- 使用Spring的好处
- 当使用spring时,我们可以使用容器提供的众多服务,简单的java对象如:事务管理服务、JMS服务、Spring core核心服务、持久化服务、其他
- 如果使用Spring, 我们就不再需要手工控制事务
public void save(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Info info = new Info("我和小伙伴们都惊呆了"); info.setContent("我和小伙伴们都惊呆了,所以才来学习Spring"); session.save(info ); session.getTransaction().commit(); }
Connection conn = null; try { ....... conn.setAutoCommit(false); Statement stmt = conn.createStatement(); stmt.executeUpdate("update person where name='小伙伴'"); conn.commit(); ..... } catch (Exception e) { conn.rollback(); } finally{conn.close();}
- 使用Spring,不再需要我们处理复杂的事务传播行为
我们只需要通过声明式的事务属性配置就可以轻松地实现这两种业务需求
1.要求Bean1.update()和Bean2.save()的在同一个事务中执行
2.要求不管Bean1.update() 的事务是否成功,都需要记录日志

@Transactional(propagation=Propagation.Required) public void payment(){ Bean1.update();//更新money Bean2.save();//记录日志 } public class Bean1 { @Transactional(propagation=Propagation.Required) public void update(){ executeUpdate(“update account set amount=? where id=?"); } } public class Bean2 { @Transactional(propagation=Propagation.RequiresNew) public void save(){ executeUpdate(“insert into Log (content) values (?)"); } }
- 轻量级与重量级概念的划分
划分一个应用是否属于轻量级还是重量级,主要看它使用了多少服务.使用的服务越多,容器要为普通java对象做的工作就越多,必然会影响到应用的发布时间或者是运行性能,
对于spring容器,它提供了很多服务,但这些服务并不是默认为应用打开的,应用需要某种服务,还需要指明使用该服务,如果应用使用的服务很少,如:只使用了spring核心服
务,那么我们可以认为此时应用属于轻量级的,如果应用使用了spring提供的大部分服务,这时应用就属于重量级。目前EJB容器就因为它默认为应用提供了EJB规范中所有的功
能,所以它属于重量级。
- Spring需要的jar
到http://www.springsource.org/download下载spring,然后进行解压缩,在解压目录中找到下面jar文件,拷贝到类路径下
distspring.jar
libjakarta-commonscommons-logging.jar
如果使用了切面编程(AOP),还需要下列jar文件
lib/aspectj/aspectjweaver.jar和aspectjrt.jar
lib/cglib/cglib-nodep-2.1_3.jar
如果使用了JSR-250中的注解,如@Resource/@PostConstruct/@PreDestroy,还需要下列jar文件
libj2eecommon-annotations.jar
- spring的配置文件模版
该配置模版可以从spring的参考手册或spring的例子中得到。配置文件的取名可以任意,文件可以存放在任何目录下,但考虑到通用性,一般放在类路径下

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!--此处为小伙伴们的代码--> </beans>
- spring配置文件帮助信息配置
由于spring的schema文件位于网络上,如果机器不能连接到网络,那么在编写配置信息时候就无法出现提示信息,解决方法有两种:
1.让机器上网,eclipse会自动从网络上下载schema文件并缓存在硬盘上.
2.手动添加schema文件,方法如下:
windwos->preferences->myeclipse->files and editors->xml->xmlcatalog
点"add",在出现的窗口中的Key Type中选择URI,在location中选"File system",然后在spring解压目录的dist/resources目录中选择spring-beans-2.5.xsd,回到设 置窗口的时候不要急着关闭窗口,应把窗口中的Key Type改为Schema location,Key改为http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- 实例化spring容器
方法一:
在类路径下寻找配置文件来实例化容器
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"beans.xml"});
方法二:
在文件系统路径下寻找配置文件来实例化容器
ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[]{“d:\beans.xml“});
Spring的配置文件可以指定多个,可以通过String数组传入
- 从spring容器中得到bean
当spring容器启动后,因为spring容器可以管理bean对象的创建,销毁等生命周期,所以我们只需从容器直接获取Bean对象就行,而不用编写一句代码来创建bean对象。从容器获取bean对象的代码如下:
ApplicationContext ctx = new ClassPathXmlApplicationContext(“beans.xml”);
OrderService service = (OrderService)ctx.getBean("personService");
- 三种实例化bean的方式
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 6 <!-- 1使用类构造器实例化 --> 7 <bean id="personService" class="cn.test.service.impl.PersonServiceBean"></bean> 8 <!-- 2使用静态工厂方法实例化 --> 9 <bean id="personService2" class="cn.test.service.impl.PersonServiceBeanFactory" factory-method="createPersonServiceBean"/> 10 <!-- 3使用实例工厂方法实例化 --> 11 <bean id="personServiceFactory" class="cn.test.service.impl.PersonServiceBeanFactory"/> 12 <bean id="personService3" factory-bean="personServiceFactory" factory-method="createPersonServiceBean2"/> 13 </beans>
-
Bean的作用域
singleton
在每个Spring IoC容器中一个bean定义只有一个对象实例。默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。如:
<bean id="xxx" class="cn.itcast.OrderServiceBean" lazy-init="true"/>
如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=“true“,如下:
<beans default-lazy-init="true" ...>
prototype
每次从容器获取bean都是新的对象