Spring学习4 - 读取Properties配置文件、AOP编程

13 篇文章 0 订阅

1. 自动读取Properties配置文件,实现自动注入

步骤

  1. 增加描述文件头 - context

  2. 加载properties配置文件 – < <context:property-placeholder location=“classpath:配置文件名” system-properties-mode=“NEVER”/>

  3. 注入属性 -

  Spring容器配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LiAYEPGd-1577063423572)(en-resource://database/13982:1)]

  dpet.properties配置文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qw9PMUHG-1577063423581)(en-resource://database/13984:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V9PqM7cY-1577063423593)(en-resource://database/13988:1)]


  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);
	}
	
}

  运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vMzRyhi3-1577063423596)(en-resource://database/13986:1)]

2. AOP - 面向切面编程

原理是利用高级的代理模式 - 双代理结合使用

2.1 概念图
高级代理模式
JDK内置动态代理 -- 被代理有接口实现
Spring的CGLIB继承代理 -- 被代理无接口实现
作用:
只适合有横切逻辑的应用场合
解决分散在各个页面都有相同的逻辑代码 - 抽取出来由一个模块进行管理
性能监控、事务处理、日志、权限管理等
AOP的概念
切入点pointcut:什么包下什么类中的什么方法
增强、通知advice:除了pointcut切入点做的事情,还额外做的其他事情
pointcut + advice = 切面aspect
织入:切面给Spring容器进行管理
增强advice的时机:
before:切入点运行前
after-returning:切入点方法正常调用结束后
after-throwing:切入点方法调用发生异常时
after:finally运行时
around:一个语句可取代这四个语句

2.2 为什么需要AOP编程

减少重复代码、让Service程更加专注于业务逻辑

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lck5rkPm-1577063423600)(en-resource://database/14014:1)]

2.3 切入点表达式的定义

切入点表达式语法: execution( 修饰符? 返回类型 声明类型? 方法全限定名( 参数类型 ) 异常类型?) → 问号表示问号前面的东西可以不用写

切入点表达式
(..) → 代表切入点方法参数无限制
.. → 含有当前包、以及子孙包
* → 代表任意

官方示例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eR64cSQL-1577063423603)(en-resource://database/13998:1)]

简单的例子
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-71Ls33PJ-1577063423606)(en-resource://database/13996:1)]

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>可压缩成一句配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qolDicGi-1577063423609)(en-resource://database/14012:1)]

2. EmpService
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4PxpPwUl-1577063423615)(en-resource://database/14008:1)]

  3. AddMethod
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sDVjWBsk-1577063423618)(en-resource://database/14010:1)]

2.4 切面(切入点+增强)配置 — 注解

切入点、增强时机都加在增强方法类中


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mV7HaCxJ-1577063423624)(en-resource://database/14002:1)]


  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);
	}
	
}


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rJE414Zw-1577063423628)(en-resource://database/14004:1)]


  当Service抛出异常时 - Spring进行异常处理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dIy0l6By-1577063423632)(en-resource://database/14006:1)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值