重习spring知识点
距离自学spring过去了快一年的时间了,因为用得比较少,很多都忘记了,这次又重新看起了spring,下面是我整理的一些知识点。
说到spring,我们就会想到经常会问到IOC和AOP。
IOC是控制反转,什么叫做控制反转?理解上来说,在没有spring之前,对象的控制权都来自于程序员,当我们使用了Spring,对象的控制权由程序员转向了外部,对象的创建和初始化就不再是程序员所控制,这种就是控制反转。在控制反转中,还会提及到容器,这里的容器实际上就是上面提到的外部,使用spring就是将对象放在容器中,这里的对象就是bean。谈到spring,我们还会想到DI(依赖注入),在一定的方面,我们可以将IOC等同于DI,依赖注入就是将对应的属性的值注入具体的对象.
说说使用spring的好处,在一开始,我们创建dao对象的时候,都是经过new,如果需要同时执行多个dao对象的时候,就需要编写多个dao实现类,并且在serviceimpl去new多个对象,这个过程是高耦合的,但是我们在写代码的时候,一般要求不会想要高耦合,这个时候,使用spring的控制反转是可以降低耦合性,主要是通过使用IOC容器管理bean,将IOC容器含有依赖关系的bean进行关系绑定。通过代码我们可以知道,跟不使用spring不同的是,spring不需要new对象,只要在application.xml文件中绑定service和dao之间的关系即可,不使用spring的代码如下:
userDao接口
public interface UserDao{
public void save();
}
userDao实现类
public class UserDaoImpl implements UserDao {
public void save(){
System.out.println("save dao...");
}
}
service接口
public interface UserService {
public void save();
}
service实现类
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
public void save(){
System.out.println("save service...");
userDao.save();
}
}
使用spring的代码如下:
userDao接口、userDao的实现类和userService接口的代码不变
userServiceImpl实现类:
private UserDao userDao;
public void save(){
System.out.println("save service...");
userDao.save();
}
public void setUserDao(UserDaoImpl userDao) {
this.userDao = userDao;
}
application.xml
<bean id="userService" class="com.example.spring.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
上面的代码是实现service和dao的依赖绑定
spring另外一大核心就是AOP
AOP是oop的补充,面向切面编程,它的核心有连接点、切入点、通路和切面。
连接点是可能被截断的方法,切入点是增强的连接点,切面负责连接点和切入点的连接,通路具有增强功能。
在代码中需要在pom.xml导入坐标,然后使用注解@aspect和@Pointcut(“execution(返回参数 包名.接口名.方法名(参数))”)
在连接点方法上用注解@Before(“上述的方法名”)即可
还需要在自己配置的SpringConfig类加入注解@EnableAspectJAutoProxy在当前的配置类上。、
aop的切入点表达式
execution(返回参数 包名.接口.类名.方法名(参数)) 可以用*来表示任意返回参数、任意包名、任意接口、任意方法名、任意参数。
切入点通常描述接口,不描述实现类,返回类型对于增删改操作使用精准类型加速匹配,对于查询采用通配类型加速匹配。
一般不采用…匹配,效率低,一般采用单个匹配或者进行精准匹配
方法名以动词进行精准匹配,以名词进行*通配匹配。
aop的通知类型有@Before,@After,@Around,@AfterReturning,@After
Throwing
其中Around环绕通知需要使用异常处理,以及参数ProceedingJoinPoint来实现对原始方法的调用,AfterReturning是没有异常,正常执行到最后调用的,AfterThrowing是出了异常之后使用的。
AOP可以获取数:获取参数,获取返回值,获取异常信息
AOP获取参数,@Before(JoinPoiont jp),@After(JoinPoint jp),@Around(ProceedingJoinPoint pjp),执行原始方法获得返回值。
AOP可以解决密码出现空格的问题,可以获取参数之后,然后把对象里面的空格去掉,再重新放入对象中,传给业务层,这样子尽管密码中有空格也可以成功登录。
Spring事务管理
说到Spring的事务管理,首先就得说一下事务管理是什么?事务管理是指再数据层的数据操作同成功或同失败。
Spring的事务管理是指在数据层或业务层中的操作中同成功或同失败。
典型的例子可以用银行转账,当我们进行转账的时候,本应该出现一方减钱,一方加钱,但是如果在执行的过程中出现异常,那么一方会执行相对应的操作,另外一方就无法执行,这是不可能存在的情况,所以在业务接口层加入@Transactional操作实现事务处理,不加在业务实现类上,是为了降低耦合,然然后在配置类中增加一个对象,使用PlatformTransactionManager设置事务管理器,同时需要在配置类中开启事务注解@EnableTransactionManagement
spring事务角色
事务管理员和事务协调员
事务管理员是开启事务的,存在于业务层中。
事务协调员是用来加入事务的,在数据层也在业务层中。
spring角色属性
spring如果只读的话,可以使用readOnly
spring不超时的话,可以使用timeout属性
spring还可以使用Propagation.support_new