文章目录
1. 自动读取Properties配置文件,实现自动注入
步骤
-
增加描述文件头 - context
-
加载properties配置文件 – < <context:property-placeholder location=“classpath:配置文件名” system-properties-mode=“NEVER”/>
-
注入属性 -
Spring容器配置
dpet.properties配置文件
Emp源码
public class Dept {
String deptno;
String dname;
String loc;
public void setDeptno(String deptno) {
this.deptno = deptno;
}
public void setDname(String dname) {
this.dname = dname;
}
public void setLoc(String loc) {
this.loc = loc;
}
@Override
public String toString() {
return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc + "]";
}
}
测试代码
@RunWith(value=SpringJUnit4ClassRunner.class)
@ContextConfiguration("applicationContext.xml")
public class DITest {
@Autowired
Dept dept;
@Test
public void test() {
System.out.println(dept);
}
}
运行结果
2. AOP - 面向切面编程
原理是利用高级的代理模式 - 双代理结合使用
2.1 概念图
2.2 为什么需要AOP编程
减少重复代码、让Service程更加专注于业务逻辑
2.3 切入点表达式的定义
切入点表达式语法: execution( 修饰符? 返回类型 声明类型? 方法全限定名( 参数类型 ) 异常类型?) → 问号表示问号前面的东西可以不用写
官方示例
简单的例子
2.4 切面(切入点+增强)配置 — XML
1. Spring容器配置文件
<context:component-scan base-package="top.linruchang.方法增强实验"></context:component-scan>
<bean id="addAdvice" class="top.linruchang.方法增强实验.AdviceMethods"></bean>
<bean id="empService" class="top.linruchang.方法增强实验.EmpService"></bean>
<aop:config>
<aop:pointcut expression="execution(* top.linruchang.方法增强实验.EmpService.*(..))" id="pointcut" />
<aop:aspect ref="addAdvice">
<aop:before method="startAdvice" pointcut-ref="pointcut" />
<aop:after-returning method="endAdvice" pointcut-ref="pointcut" />
<aop:after-throwing method="throwAdvice" pointcut-ref="pointcut" throwing="throwing"/>
<aop:after method="finallyAdvice" pointcut-ref="pointcut" />
</aop:aspect>
</aop:config>
<aop:aspect>可压缩成一句配置
2. EmpService
3. AddMethod
2.4 切面(切入点+增强)配置 — 注解
切入点、增强时机都加在增强方法类中
1. XML - 必要的配置
<!-- 扫描base-package包下的所有含有Component的注解、将他们注册到Spring容器,交给容器管理 -->
<context:component-scan base-package="top.linruchang.方法增强实验"></context:component-scan>
<!-- 使AOP面向切面的注解生效 - 千万别忘了 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
2. EmpService代码
@Service
public class EmpService {
public void deleteId(int id) {
id = 100/id;
System.out.println("执行数据库的操作 - 删除Empno为id的数据行");
}
}
3. AddMethods增强类
@Component
@Aspect
public class AdviceMethods {
//用于告知Spring准备将增强的处理作用在哪个类方法中 - 切入点
@Pointcut(value="execution(* top.linruchang.方法增强实验.EmpService.*(..))")
private void pointCut() {}
// 被增强方法运行前执行
@Before(value="pointCut()")
public void startAdvice() {
System.out.println("方法运行前 - 增强");
}
// 被增强方法运行完成后执行
@AfterReturning(value="pointCut()")
public void endAdvice() {
System.out.println("方法运行结束 - 增强");
}
// 被增强方法执行到finally后执行
@After(value="pointCut()")
public void finallyAdvice() {
System.out.println("执行到finally运行后 - 增强");
}
// 被增强方法抛出异常 -- 注意是抛出异常才会被触发这个方法
@AfterThrowing(value="pointCut()", throwing="throwing")
public void throwAdvice() {
System.out.println("处理异常-增强:"+ throwing.getMessage());
}
}
去掉上面的方法注解 - 增添一个方法进行统一管理切入点的所有时机增强
@Around(value="pointCut()")
public void around( ProceedingJoinPoint pjp ) {
try {
startAdvice();
pjp.proceed();
endAdvice();
}catch(Throwable throwable) {
throwAdvice(throwable);
} finally {
finallyAdvice();
}
}
4. 测试代码 - -验证注解配置是否成功
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("applicationContext.xml")
public class TestAdvice {
@Autowired
EmpService empService;
@Test
public void test() {
empService.deleteId(1);
}
}
当Service抛出异常时 - Spring进行异常处理