Spring特点
- 方便解耦,简化开发
通过IOC,将对象之间的依赖关系交由Spring进行控制,避免硬编码导致程序过度拟合 - 支持AOP
通过Spring 提供AOP功能,实现面向切面编程的功能,让许多不容易用OOP实现的功能可以通过AOP轻松应付,如日志等 - 声明式事务支持
通过Transactions模块,进行声明式事务管理,免于程序员对繁琐事务的管理。 - 支持Junit4单元测试功能
- 方便继承其他优秀框架
支持Mybatis,Hibernate等框架
Spring架构
- DataAccess部分
提供JDBC模块
ORM模块——object relation mapping
OXM模块——Object xml mapping
JMS——Java消息服务
Transactions——事务管理
DataAccess这部分会用Mybatis来代替 - Web部分
提供Servlet,WebSocket,Web,Portlet模块
Web这部分最后会使用SpringMVC来代替 - 单项功能支持
1) AOP功能
2)Aspects功能
3)Instrumentation功能 - Messaging功能
- 核心容器—Core Container
Beans——Bean工厂与Bean装配
Core——Spring-core 依赖注入IOC与DI的实现支持
Context——Spring-context:Spring的context上下文即IOC容器
SpEL——Spring 的EL表达式 - Test——继承Junit4进行单元测试
Spring中的IOC和DI
IOC-控制反转
软件系统在没有引入IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。
软件系统在引入IOC容器之后,这种情形就完全改变了,如图3所示,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。
通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。
既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
过程
DI-依赖注入
1.添加jar包
2.创建配置文件applicationContext.xml
<?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.xsd">
</beans>
3.在配置文件中创建对象
<bean id="对象名" class="类的完整路径">
<property name="属性名" ref="对象的id值">
</property>
</bean>
4.加载配置文件,获得对象
ApplicationContext app=new ClassPathXmlApplicationContext("spring.xml");
Users users=(Users)app.getBean("u1");
DI 注入方法
一种是通过set方法赋值,一种是使用构造方法赋值
- set注入值
基本属性类型值注入
<property name = "name" value = "jeck"/>
引用属性类型值注入
<property name = "car" ref = "car"/>
- 构造注入
通过name属性,按照参数名赋值
public Person(String name,Car car){
this.name = name;
this.car = car;
System.out.println("Person的有参构造"+name + car);
}
<bean name = "person" class = "com.xzk.spring.bean.Person">
<constructor-arg name = "name" value = "rose"/>
<constructor-arg name = "car" ref = "car"/>
</bean>
通过index属性,按照参数索引注入
<bean name = "person" class = "com.xzk.spring.bean.Person">
<constructor-arg name = "name" value = "rose" index = "0"/>
<constructor-arg name = "car" ref = "car" index = "1"/>
</bean>
- 注解注入
添加在类名上的
@Component("对象名") //component是不是MVC架构下,使用的,是Service Controller Repository 的父注解
@Service("person") // service层
@Controller("person") //控制的Controller层
@Repository("person") //持久化的dao层
@Scope(scopeNmae="singleton") //单例对象
@Scope(scopeName="prototype") // 多例对象
添加在属性上
@Value("属性值")
private String name;
@Autowired // 如果一个接口类型同时又两个实现类,则会报错,此时需用
@Qualifier("bean name")
private Car car;
// @Resource 是java的注释,但是Spring框架支持,@Resource指定注入哪个名称的对象
@Resource(name = "对象名") == @Autowired + @Qualifier("name")
private Car car;
添加在方法上
@postConstruct //等价于init-method属性
@PreDestroy // 等价于destroy-method属性