Spring
spring是轻量级的,IOC和AOP的一站式java开发框架,简化企业级开发。
其中:
轻量级:框架体积小(核心模块),
IOC:Inversion of Control(控制反转),把创建对象的控制权,反转给Spring框架。
以前程序中需要对象,都是自己new,
例如:new StudentDao对象。
AOP:Aspect Oriented Programming(面向切面编程)
将程序中的一些公共的非业务代码分离提取出来,然后在业务代码执行时,给他们横切进来。
底层使用动态代理机制,在我们的业务代码中,不显示的调用,但在执行业务代码,会通过代理对象,调用非业务代码。
一站式:除了核心的ICO和AOP功能外,还对数据访问层,web层都有封装,所以是一站式的。
Spring bean管理
bean对象,由于把对象交给spring对象交给spring管理后,spring会对对象进行功能的增强,所以在spring框架中生成的对象,统一称为bean对象。
区分这个对象还是我们自己new的还是spring框架生成的。
spring 中 bean管理有两种方式
1.基于xml配置方式
在spring的配置文件注册需要spring框架管理的类
使用bean标签,配置需要让spring管理的类
1.基于xml配置方式
id="对象名称,可以在getBean中获得spring生成的对象"
class="需要让spring管理的类的地址"
scope="配置bean的作用域”
scope="singleton" 单例的 在spring框架启动时,就创建对象,而且始终只创建了一个对象.默认是
scope="prototype" 原型(多例),在每次获得对象时,创建对象
IOC 指的是让spring框架创建对象,创建对象的同时,还有一个动作,称为依赖注入
依赖注入:在创建对象时,为对象中属性赋值
注入两种方法:
1.通过属性注入,属性的set方法
<bean id="admin" class="com.ffyc.springpro.model.Admin" scope="prototype" >
<property name="account" value="张三"></property>
<property name="password" value="123"></property>
</bean>
2.通过构造方法注入
<bean id="admin" class="com.ffyc.springpro.model.Admin" scope="prototype">
<constructor-arg name="account" value="张三"></constructor-arg>
<constructor-arg name="password" value="123"></constructor-arg>
</bean>
<bean id="adminDao" class="com.ffyc.springpro.dao.AdminDao"></bean>
<bean id="adminService" class="com.ffyc.springpro.service.AdminService">
<property name="adminDao" ref="adminDao"></property>
</bean>
2.基于注解
bean管理和自动注入
自动注入有两种匹配值的方式:
1.通过属性的类型查找(默认使用)
2.对象的名字查找
/*
开启spring注解扫描功能 扫描指定的包
spring 注解方式bean管理, 自动注入
@Autowired 是spring框架提供的注解
用于属性和属性的set方法上,如果写在属性上,set方法都可以不需要
默认情况下,要注入的值不能为空 required=true
自动注入有两种匹配值的方式:
1.通过属性的类型查找(默认使用)
2.对象的名字查找
@Qualifier(value = "adminDao")
@Resource(name = "adminDao") 是Java语言里提供的注解
也是添加在属性上,不需要写set方法
注入的值也不能为空
也可以通过类型查找要注入的对象
也可以通过名字来查找要注入的对象
*/
IOC:
反转控制,不是具体的技术,是一种设计。
把生成对象的控制权,反转给spring框架,spring框架负责管理对象的整个生命周期过程。
对外提供获取对象的方法,在程序中哪里需要,在那里获取即可。
AOP:
AOP:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 AOP是OOP的延续,是软件开发中的一个热点,是java开发中的一个重要内容。利用AOP可以对业务逻辑和非业务逻辑进行隔离,从而使得各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 面向切面编程的好处就是:减少重复,专注业务; 核心原理: 使用动态代理的方式在执行方法前后或者出现异常的时候做加入相关的逻辑. 使用案例: 事务处理:开启事务,关闭事务,出现异常后回滚事务 权限判断:在执行方法前,判断是否具有权限.
面向切面编程:面向切面编程是对面向对象编程的补充延续。
面向切面编程思想是将程序中的非业务代码(提交事务,打印日志,权限验证,统一异常处理),然后在调用业务代码时,通过一个代理对象帮助我们调用这些分离提取出来的非业务代码,这样在业务代码中不会显示的调用非业务代码,做到业务代码和非业务代码的分离,降低了耦合度。
好处:模块间的耦合度降低了
原理:动态代理模式,给业务代码生成代理对象。
AOP编程思想是java中的,不是spring专有的,是spring使用AOP这一编程思想.
Spring事务管理
事务管理本质是数据库提供的一种管理机制。
数据库事务管理是对一次数据库操作过程中执行的多条语句进行管理,确保一次操作过程中的多条sql要么都执行成功,要么都不执行,从而确保数据的一致性。
spring事务管理是spring框架对事务提交这一功能进行封装,程序员在业务开发中不需要显示的提交事务。
Spring中的事务管理分两种形式:
1.编程式事务管理:需要程序员在代码中自己控制事务提交和回滚.
2.声明式事务管理:
声明事务底层使用了AOP思想,可以为方法添加事务功能,他的控制是方法级别的。
声明式事务不生效场景:
1@Transactional 应用在非 public 修饰的方法上。
2..方法中的异常被 catch 捕获,导致认为方法没有而失效,导致数据提交。
3.出现编译期异常,还是会提交事务 @Transactional后加上(rollbackFor = Exception.class)碰到所有异常都会生效回滚。
4.数据库引擎不支持事务 mysql中只有innodb引擎支持事务的。
@Transactional//声明事务管理标签 一般添加到service层的方法上,不建议加Dao层上,因为一个service层的方法可能会调用多个Dao层的方法
public void insertAdmin(){
adminDao.insert1();
/*
不生效场景3
@Transactional后加上(rollbackFor = Exception.class),就可正常生效了
"aa".getBytes("utf-888");//编译期异常,会让Spring事物管理失效,insert1会执行。
*/
//System.out.println(10/0);
adminDao.insert2();
/*不生效场景2
try {
System.out.println(10/0);
adminDao.insert2();
}catch (Exception e){
e.printStackTrace();
}*/
//adminDao.insert("王天乐诗人我吃");
}