Spring IOC、AOP代码实操 注解方式
一、导入依赖
spring、lombok
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
asceptj
<!--实现的是注解方式来操作你的aop切面的编程;加入你的asceptj -->
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.1</version>
</dependency>
数据库连接
<!--连接数据库的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
<!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
二、写一个日志切面类
@Aspect:作用是把当前类标识为一个切面供容器读取
@Pointcut:Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分,一是表达式,二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。
@Around:环绕增强,相当于MethodInterceptor
@AfterReturning:后置增强,相当于AfterReturningAdvice,方法正常退出时执行
@Before:标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有
@AfterThrowing:异常抛出增强,相当于ThrowsAdvice
@After: final增强,不管是抛出异常或者正常退出都会执行
@Component
@Aspect
public class LogsAdvice { //这个就是日志的切面
//前置通知
// @before("写的就是要拦截哪个内容") 代表是目标对象中的每一个犯法执行到这个地方的时候就启动你的额前置通知;
//加入你的约束条件 其实就是你的主流的业务中的方法名字中最后为User的
@Before("execution(void *User(..))")
public void before(JoinPoint jp) {
String name=jp.getSignature().getName(); //通切入点获取你的目标对象的名字;
System.out.println("前置通知已经启动---------------------目标对象的名字:"+name);
}
@After("execution(void *User(..))")
public void after(JoinPoint jp) {
String name=jp.getSignature().getName(); //通切入点获取你的目标对象的名字;
System.out.println("最终-------通知已经启动---------------------目标对象的名字:"+name);
}
@Around("execution(void *User(..))")
public void around(ProceedingJoinPoint pjp) {
String name=pjp.getSignature().getName();
System.out.println(name+"环绕通知在你的业务的执行的前面----------%%%%%%%%%%%-----------------");
try {
pjp.proceed(); //去执行你的主流业务;
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name+"环绕通知在你的业务的执行的后边------------*********--------------");
}
// 后置的通知:
@AfterReturning("execution(void *User(..))")
public void finalLog(JoinPoint jp) {
String name=jp.getSignature().getName();
System.out.println(name+"后置的通知被执行的-------##########################");
}
// 异常通知;当你的代码有异常的时候;
@AfterThrowing(pointcut = "execution(void *User(..))")
public void exception(JoinPoint jP) {
String name=jP.getSignature().getName();
System.out.println(name+"这个方法执行的过程中出现异常------------------------------");
}
}
三、连接数据库分层架构
后期数据,需要从数据库从获取
如图:
1、pojo实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Stu {
private int id;
private String name;
private String password;
private int age;
private String email;
}
2、dao层接口、dao层实现类
dao层实现类进行数据库操作
public interface Dao {
public void add() throws Exception;
public void del() throws Exception;
public void update() throws Exception;
public void select() throws Exception;
}
@Data
public class DaoImpl implements Dao{
private JdbcTemplate jdbcTemplate;
public void add() throws Exception {
// TODO Auto-generated method stub
System.out.println(jdbcTemplate);
String sql="insert into user(name,password,email,age) value(?,?,?,?)";
int cout=jdbcTemplate.update(sql, "zhangsan","1232332","12345@qq.com",23);
System.out.println("有数据进入到数据:"+cout);
}
public void del() throws Exception {
// TODO Auto-generated method stub
String sql="delete from user where id=?";
int count=jdbcTemplate.update(sql, 57);
System.out.println("删除数据成功:"+count);
}
public void update() throws Exception {
// TODO Auto-generated method stub
String sql="update user set name='小狗熊' where id=?";
int count=jdbcTemplate.update(sql, 58);
System.out.println("修改数据成功:"+count);
}
public void select() throws Exception {
// TODO Auto-generated method stub
String sql="select *from user";
RowMapper<Stu> rowMapper=new BeanPropertyRowMapper<Stu>(Stu.class);
List<Stu> list=jdbcTemplate.query(sql,rowMapper);
for (Stu stu : list) {
System.out.println(stu.getName()+"\t"+stu.getEmail());
}
}
}
3、service层接口、service层实现类
public interface StuService {
void serAdd() throws Exception;
void serDel() throws Exception;
void serUp() throws Exception;
void serSelect() throws Exception;
}
@Data
public class StuServiceImpl implements StuService{
private DaoImpl daoImpl;
public void serAdd() {
// TODO Auto-generated method stub
try {
daoImpl.add();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void serDel() {
// TODO Auto-generated method stub
try {
daoImpl.del();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void serUp() {
// TODO Auto-generated method stub
try {
daoImpl.update();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void serSelect() {
// TODO Auto-generated method stub
try {
daoImpl.select();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
四、配置Bean.xml文件,连接数据库
- 扫描包
<!--扫描包-->
<context:component-scan base-package="com.hzc"></context:component-scan>
- 让当前的项目支持我们的Aspect的代理
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
- 导入外部文件c3p0.properties
<context:property-placeholder location="classpath:c3p0.properties"></context:property-placeholder>
c3p0.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=123456
- 配置数据源
<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass">
<value>${jdbc.driverClassName}</value>
</property>
<property name="jdbcUrl">
<value>${jdbc.url}</value>
</property>
<property name="user">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
</bean>
- 注入jdbcTemplate
<!--注入jdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="datasource"></property>
</bean>
- 注入DaoImpl
<!--注入DaoImpl-->
<!-- 这个是我们的dao层他要注入你的 jdbcTemplate-->
<bean id="daoImpl" class="com.hzc.dao.DaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
- 注入StuServiceImpl
<!--注入StuServiceImpl-->
<bean id="stuServiceImpl" class="com.hzc.service.StuServiceImpl">
<property name="daoImpl" ref="daoImpl"></property>
</bean>