Spring详解
1.概述:
Spring 是轻量级的。
为解决企业及开发的复杂性而产生的,是一个轻量级的控制反转和面向切面的容器框架。
控制反转(IOC):将对象的创建权反转给spring,实现了程序的解耦和;
依赖注入(DI):实现ioc实现需要DI做支持,一个类中的属性(其他对象)不再需要手动new或者通过工厂方法进行创建,而是Spring容器在属性被使用的时候给予注入;
注入方式:
set方法注入
构造方法注入
字段注入
注入类型:
值类型注入(8个基本数据类型)
引用类型注入(将依赖对象注入)
2.操作:
1.导包
2.创建一个对象:
3.配置注册对象到容器
xml文件,建议放在src下,文件名建议applicationContext.xml
4.代码测试:
3.概念:
applicationContext&BeanFactory
BeanFactory 接口
spring原始接口.最底层的接口。针对原始接口的实现类功能较为单一
BeanFactory接口实现类的容器.特点是每次在获得对象时才会创建对象,为了节省内存
ApplicationContext
每次容器启动时就会创建容器中配置的所有对象.并提供更多功能
从类路径下加载配置文件:ClassPathXmlApplicationContext
从硬盘绝对路径下加载配置文件:FileSystemXmlApplicationContext(“d:/xxx/yyy/xxx”)
4.配置
4.1spring创建对象的三种方法:
空参构造法:
1.<bean name="user" class="com.User"></bean>
2.ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml"); //1.创建容器对象,相对于src下的路径
静态工厂:
1.<bean name="user2" class="com.sjtu.b_create.UserFactory" factory-method="createUser"></bean>
2.测试
public void fun2() {
ApplicationContext ac=new ClassPathXmlApplicationContext("com/sjtu/b_create/applicationContext.xml");
User u=(User) ac.getBean("user2");
}
实例工厂:
4.2 元素
1.scope属性
singleton(默认值):单例对象,被标识为当日的对象在spring容器中只会存在一个实例
2.prototype
被标识为多例的对象,每次再获得時才会获得对象,每次都是新的的对象。整合Struts时,ActionBean必须配置为多例。
3.request
web环境下,对象与request生命周期一致
4.session
web环境下,对象与session生命周期一致
4.3 属性注入
set方法注入:(前提是set注入之前该对象提供setter方法)
<bean name="user" class="com.User">
<property name="name" value="tom"></property>
<property name="age" value="18"></property>
</bean>
构造方法注入:
<bean name="user2" class="com.User">
<!-- name属性:构造函数参数名 --> <!-- index属性:构造函数参数索引 --> <!-- type属性:构造函数参数类型 --> <!-- 上述三个属性不必全部出现,根据情况选择即可 -->
<constructor-arg name="name" value="Jerry" index="0" type="java.lang.String"></constructor-arg>
</bean>
复杂类型注入:(数组,list,map等)
5.注解配置spring
5.1.步骤
为主配置文件引入新的命名空间(约束)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd ">
<!-- 指定扫描com.sjtu.bean包下的所有类中的注解
注意:扫描包时,会扫描指定包下的所有子孙包 -->
<context:component-scan base-package="com.sjtu.bean"></context:component-scan>
</beans>
类中完成注解配置
@Component("user") //这四个注解完全一样,以下三个只是为了分层
@Service("user") //Service层
@Controller("user") //Web层
@Repository("user") //Dao层
public class User {
}
5.2.其它注解
scope
//指定对象作用范围
@scope(scopeName="prototype")
public class User{}
值注入类型
//方法一
@Value("Tom")
//加到成员变量上,通过反射的Field赋值,破坏封装性
private String name;
//方法二
@Value("Tom")
//通过set方法赋值
public void setName(String name) {
this.name = name;
}
引用类型引入
初始化,销毁方法
6.aop
AOP是spring框架面向切面的编程思想,aop采用一种称为“横切”的技术,将涉及到多业务流程的通用功能抽取并单独封装。形成独立的切面,再合适的时机将这些切面横向切入到业务流程指定的位置中。
Joinpoint(连接点):程序执行时的某个特定的点,在Spring中就是某一个方法的执行 。
Pointcut(切点):说的通俗点,spring中AOP的切点就是指一些方法的集合,而这些方法是需要被增强、被代理的。一般都是按照一定 的约定规则来表示的,如正则表达式等。切点是由一类连接点组成。
Advice(通知):还是说的通俗点,就是在指定切点上要干些什么。
Advisor(通知器):其实就是切点和通知的结合 。
实现步骤:
编写需要切入业务流程的独立模块(也称为切面)和切入点(模块中的方法)
在Spring配置文件中配置AOP,添加切入面、切入点以及需要切入的目标Bean
编写测试代码
实现方式:
采用声明的方式来实现(基于XML)
采用声明的方式实现(在XML文件中配置),大致步骤为:配置文件中配置pointcut, 在java中用编写实际的aspect 类, 针对对切入点进行相关的业务处理。
采用注解的方式来实现(基于AspectJ)
采用注解来做aop, 主要是将写在spring 配置文件中的连接点写到注解里面
7.事务管理
事务是逻辑上的一组操作,要么都执行,要么都不执行
事物的特性(ACID):
原子性:事物的最小单位,不允许分割
一致性:执行事务前后,数据保存一致
隔离性:并发访问数据库时,用户的事务不受其它事物的干扰,并发的数据库之间是独立的
持久性:事务被提交后,再也不受任何影响
接口:
PlatformTransactionManager: (平台)事务管理器
TransactionDefinition: 事务定义信息(事务隔离级别、传播行为、超时、只读、回滚规则)
TransactionStatus: 事务运行状态