目录
5.spring中的事务?
1.什么是aop?
Aspect Oriented Programming,面向切面编程,就是将众多的业务模块进行横向切割,提炼抽取其中的相同功能代码进行单独编程,以达到业务代码与非业务功能代码的隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 核心思想就是横向切割,纵向抽取。
2.aop的实现原理?
动态代理
package com.ychs.service;
//第一步先写接口
public interface UserService {
public void add();
public int edit(int a);
public void del();
public void get();
}
//被代理的对象
public class UserServiceImpl implements UserService {
@Override
public void add() {
System.out.println("添加。。");
}
@Override
public int edit(int a) {
System.out.println("修改。。。"+a);
return 0;
}
@Override
public void del() {
System.out.println("删除。。。。。");
}
@Override
public void get() {
System.out.println("查询。。。");
}
}
//生成代理对象
public class UserServiceFactoryProxy {
//目标对象 被代理的对象
private UserService userService;
//获取代理对象
public UserService getUserServiceProxy(){
//返回来UserService的子类对象,第一个参数是类加载器
//第二个参数被代理类实现的接口
//第三个参数是要增强的代码和执行
return (UserService) Proxy.newProxyInstance(
UserServiceFactoryProxy.class.getClassLoader(),
UserServiceImpl.class.getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start.....");
//中间执行的目标方法,是通过反射
Object obj = method.invoke(userService, args);
System.out.println("end.......");
return obj;
}
}
);
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
//编写Test类
@Test
public void f2(){
UserServiceFactoryProxy userServiceFactoryProxy = new UserServiceFactoryProxy();
userServiceFactoryProxy.setUserService(new UserServiceImpl());
//拿到代理对象
UserService userServiceProxy = userServiceFactoryProxy.getUserServiceProxy();
userServiceProxy.add();
int res = userServiceProxy.edit(2);
System.out.println("res="+res);
userServiceProxy.del();
}
3.aop中的名词
Joinpoint(连接点 ): 在目标对象中,所有可以增强的方法。(edit,add方法)
Pointcut(切入点):在目标对象中,要增强的方法。(实际增强的方法)
Advice(增强/通知):增强的代码。(比如:start....,end...)
通知的类型:1.Before:在目标对象之前执行
2.Around:环绕通知 在目标对象之前后之后都会执行
3.After-returing:在目标方法之后执行,出行异常不执行
4.After-throwing:异常通知,出现异常才执行
5.After:目标对象之后执行,不管出没出现异常都执行
Target(目标对象):被代理对象(userservice)
Weaving(织入):将通知应用到切入点的过程
Proxy(代理):将通知织入到目标对象之后,形成代理对象
使用:<aop:config>
<aop:pointcut> expression定义切入点的表达式:
excution(pulbic * com.ychs.service.UserserviceImpl.add(), *表示返回任意类型.public可以省略)
要对service层里边所有以ServiceImpl结尾的没有参数的方法做增强* com.ychs.service.*serviceImpl.*()
要对service层里边所有以ServiceImpl结尾的所有的方法做增强* com.ychs.service.*serviceImpl.*(..)
</aop:config>
如何往目标对象中织入通知?
1.先写要织入的方法
4. Spring和Mybatis的整合
1.创建maven过程,导入pom文件
<!-- 还有spring的一些核心包-->
<!-- spring和mybatis的整合包和连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
2. 创建maven工程结构
2.1编写db.properties
2.2编写SqlMapConfig.xml文件
2.3编写spring和mybaties的整合配置文件
<!-- 连接数据库的信息!-->
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/uolab
user=root
password=123456
<typeAliases>
<!-- <typeAlias type="com.ychs.bean.User" alias="user"></typeAlias>-->
<package name="com.ychs.bean"/>
</typeAliases>
<!-- 引入的映射文件-->
<mappers>
<!-- <mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
<!-- <mapper resource="com.ychs.mapper"/>-->
<package name="com.ychs.mapper"/>
</mappers>
5.spring中的事务?