spring概况
- Spring是一个开源框架,为了解决企业应用开发的复杂性而创建的,但现在已经不止应用于企业应用
- 是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架
- 从大小和开销上面而言spring都是轻量级的
- 通过控制反转(IOC)的技术达到松耦合的目的
- 提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发
- 包含并管理应用对象的配置和生命周期,这个意义上是一个容器
- 将简单的组件配置、组合成为复杂的应用,这个意义上是框架
什么是框架
通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也只为了实现某个软件组件规范是,提供规范所要求之基础功能的软件产品。
- 框架的特点
- 半成品
- 封装了特定的处理流程和控制逻辑
- 成熟的,不断升级改进的软件
- 框架与类库的区别
- 框架一般是封装的逻辑、高内聚的,类库则是松散的工具组合
- 框架专注于某一领域,类库则是更通用的
什么是IOC
- IOC:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建跟维护,而是由外部容器负责创建和维护。
- DI(依赖注入) 是其一种实现方式
- 目的: 创建对象并且组装对象之后的关系
spring注入
- spring注入是指在启动spring容器加载bean配置的时候,完成对变量的赋值行为
- 常用的两种注入方式
- 设值注入
- 构造注入
- 注解注入
设值注入:
<?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">
<bean id="userService" class="com.shushan.service.impl.UserServiceImpl">
<perproty name="userDao" ref="userDao"></perproty>
</bean>
<bean id="userDao" class="com.shushan.dao.impl.UserDaoImpl"></bean>
</beans>
构造注入:
<?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">
<bean id="userService" class="com.shushan.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"></perproty>
</bean>
<bean id="userDao" class="com.shushan.dao.impl.UserDaoImpl">
</bean>
</beans>
注解注入:
@Autowired
private OrderServiceImp orderService;
或者:
@Resource
private OrderServiceImp orderService;
@Autowired与@Resource的区别:
- @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
- @Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
@Autowired() @Qualifier("baseDao")
private BaseDao baseDao;
- @Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定,
如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
@Resource(name="baseDao")
private BaseDao baseDao;
bend 生命周期
- 生命周期
- 定义
- 初始化
- 使用
- 销毁
-
初始化
- 实现org.springframework.beans.factory.InitializingBean接口
,覆盖afterPropertiesSet方法 - 配置init-method
<bean id="userBeanConfig" class="com.shuhsan.UserBeanConfig" init-method="initMethod" />
public class UserBeanConfig { public void initMethod() { //to do samething } }
- 实现org.springframework.beans.factory.InitializingBean接口
-
销毁
- 实现org.springframework.beans.factory.DisposableBean接口
,覆盖destroy方法 - 配置destroy-method
<bean id="userBeanConfig" class="com.shuhsan.UserBeanConfig" init-method="destroyMethod" />
public class UserBeanConfig { public void destroyMethod() { //to do samething } }
- 实现org.springframework.beans.factory.DisposableBean接口
AWare
- spring中提供了一些以AWare结尾的接口,实现了AWare接口的bean在初始化之后,可以获取相应的资源
- 通过AWare接口,可以对spring相应资源进行操作(一定要慎重)
- 为对spring进行简单的扩展提供了方便的入口。
Bean的自动装配(Autowiring)
- No:不做任何操作
- byName:根据属性名自动装配。此选项将检查容器并根据名字(即id)查找与属性完全一致的bean,并将其与属性自动装配
- byType:如果容器中存在一个与指定属性类型相同的bean(id是否对应都不会存在影响,即使id没有都行),那么将与该属性自动装配;如果存在多个该属性类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事情都不发生
- Constructor:与不byType方式类似,不同之处在于它应用于
构造器参数。如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常。
采用byName方式装配bean.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">
<bean id="userDao" class="com.shushan.UserDaoImpl"></bean>
<bean id="userService" class="com.shushan.UserServiceImpl" autowire="byName" >
</bean>
</beans>
变化之前的beans.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">
<bean id="userDao" class="com.shushan.UserDaoImpl"></bean>
<bean id="userService" class="com.shushan.UserServiceImpl" >
<property name="userDao" ref="userDao" />
</bean>
</beans>
byType跟Constructor用法跟byName类似。