发表于: 2020-05-17 22:59:38
1 1342
今天完成的事情:今天熟悉了基于AspectJ的AOP,和log4j的使用
一. 实现AspectJ配置及通知的代码
1.注解方式
目标类
public class ProductDao {
public void save(){
System.out.println("保存商品。。。。。");
}
public String delete(){
System.out.println("删除商品。。。。。");
return "hello ";
}
public void update(){
System.out.println("修改商品。。。。。");
}
public void find(){
int i = 1/0;
System.out.println("查询商品。。。。。");
}
public void findAll(){
System.out.println("显示所有商品。。。。");
}
}
切面类
/**
* 切面类
*/
@Aspect
public class MyAspectJAnno {
@Before(value = "execution(* com.hyx.aspectJ.demo1.ProductDao.save(..))")
//可以在方法中传入JoinPoint对象,用来获得切点信息
public void before(JoinPoint joinPoint){
System.out.println("前置通知。。。。。。。。" + joinPoint);
}
/**
* 如果增强的方法有返回值,那么后置通知可以通过returning获得该方法的返回值。returning里面的名字可以随意命名,方法里面的Object类型的参数必须和returning的一样
*/
@AfterReturning(value = "execution(* com.hyx.aspectJ.demo1.ProductDao.delete(..))",returning = "result")
public void afterReturning(Object result){
System.out.println("后置通知。。。。。。。。" + result);
}
@Around(value = "execution(* com.hyx.aspectJ.demo1.ProductDao.update(..))")
public Object around(ProceedingJoinPoint proceeding) throws Throwable {
System.out.println("环绕前。。。。。");
Object obj = proceeding.proceed();//执行目标方法
System.out.println("环绕后。。。。。");
return obj;
}
@AfterThrowing(value = "execution(* com.hyx.aspectJ.demo1.ProductDao.find(..))",throwing = "e")
public void throwing(Throwable e){
System.out.println("异常抛出异常。。。。。。" + e.getMessage());
}
@After(value = "PonintCut1()")
public void after(){
System.out.println("最终通知。。。。。");
}
/* 通过Pointcut为切点命名
●在每个通知内定义切点,会造成工作量大,不易维护,对于重复的切点,可以使用@Pointcut进行定义
●切点方法: private void无参数方法,方法名为切点名
●当通知多个切点时,可以使用||进行连接
*/
@Pointcut(value = "execution(* com.hyx.aspectJ.demo1.ProductDao.find(..))")
public void PonintCut1(){}
}
applicationContext.xml配置
<!--开启Aspectj的注解开发,自动代理-->
<aop:aspectj-autoproxy/>
<!--目标类-->
<bean id="productDao" class="com.hyx.aspectJ.demo1.ProductDao"/>
<!--定义切面-->
<bean class="com.hyx.aspectJ.demo1.MyAspectJAnno"/>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDemo1 {
@Resource(name = "productDao")
private ProductDao productDao;
@Test
public void demo1(){
productDao.save();
productDao.delete();
productDao.update();
productDao.find();
productDao.findAll();
}
}
运行结果:
2. XML方式配置 用的是实现接口的传统JDK代理方式
public interface CustomerDao {
void save();
void update();
String delete();
void find();
void findAll();
}
public class CustomerDaoImpl implements CustomerDao{
public void save(){
System.out.println("保存客户。。。。。");
}
public String delete(){
System.out.println("删除客户。。。。。");
return "hello ";
}
public void update(){
System.out.println("修改客户。。。。。");
}
public void find(){
int i = 1/0;
System.out.println("查询客户。。。。。");
}
public void findAll(){
System.out.println("显示所有客户。。。。");
}
}
public class MyAspectJXml {
//前置通知
public void before(){
System.out.println("xml方式的前置通知。。。。。。。。" );
}
//后置通知
public void afterReturning(){
System.out.println("xml方式的后置通知。。。。。。。。");
}
//环绕通知
public Object around(ProceedingJoinPoint proceeding) throws Throwable {
System.out.println("xml方式的环绕前。。。。。");
Object obj = proceeding.proceed();//执行目标方法
System.out.println("xml方式的环绕后。。。。。");
return obj;
}
//异常通知
public void throwing(Throwable e){
System.out.println("xml方式的异常抛出异常。。。。。。" + e.getMessage());
}
//最终通知
public void after(){
System.out.println("xml方式的最终通知。。。。。");
}
}
<!--XML方式配置完成AOP开发-->
<!--配置目标类-->
<bean id="customerDao" class="com.hyx.aspectJ.demo2.CustomerDaoImpl"/>
<!--配置切面类-->
<bean id="myAspectJXml" class="com.hyx.aspectJ.demo2.MyAspectJXml"/>
<!--AOP相关配置-->
<aop:config>
<!--配置切入点,接口的方法-->
<aop:pointcut id="pointCut1" expression="execution(* com.hyx.aspectJ.demo2.CustomerDao.save(..))"/>
<aop:pointcut id="pointCut2" expression="execution(* com.hyx.aspectJ.demo2.CustomerDao.update(..))"/>
<aop:pointcut id="pointCut3" expression="execution(* com.hyx.aspectJ.demo2.CustomerDao.delete(..))"/>
<aop:pointcut id="pointCut4" expression="execution(* com.hyx.aspectJ.demo2.CustomerDao.find(..))"/>
<aop:pointcut id="pointCut5" expression="execution(* com.hyx.aspectJ.demo2.CustomerDao.findAll(..))"/>
<!--配置AOP切面-->
<aop:aspect ref="myAspectJXml">
<!--配置前置通知-->
<aop:before method="before" pointcut-ref="pointCut1"/>
<!--配置前置通知-->
<aop:after-returning method="afterReturning" pointcut-ref="pointCut2"/>
<!--配置前置通知-->
<aop:around method="around" pointcut-ref="pointCut3"/>
<!--配置前置通知-->
<aop:after-throwing method="throwing" pointcut-ref="pointCut4" throwing="e"/>
<!--配置前置通知-->
<aop:after method="after" pointcut-ref="pointCut5"/>
</aop:aspect>
</aop:config>
运行结果:
明天计划的事情:编写任务一的代码,并且购买服务器,部署到服务器试下
遇到的问题:1.每次idea创建新项目后,总是会默认使用C盘的本地仓库和setting.xml,自己单独创建的E盘的仓库又要从新设置?解决这个
问题2.java.lang.IllegalStateException: Failed to load ApplicationContext ,反正就是理解自己的配置文件问题
使用@ContextConfiguration注解,如果要用classpath的话,就必须把配置文件放到WEB-INF/classes/下边,而且不要用绝对路径,
所以,可以把applicationContext.xml放到WEB-INF/classes/下边,然后@ContextConfiguration({"classpath:applicationContext.xml"}),
如果是在idea的maven下要放在resource包下。
二. log4j的认识
Log4j 是一种日志框架,可以对代码的运行过程进行一些简单的跟踪展示。
log4j在maven的使用:
引入 jar 包: 首先在 pom.xml 中引入 log4j 的 jar 包,此时再次运行就可以看到控制台有日志的输出了。
其中 DEBUG 代表了日志级别,还可以写为:ERROR、WARN、 INFO A1 是起的别名,设置输出位置,布局格式,显示样式时,是设置的 A1 这个的相 关配置。
如果想在文件中输出,还可以在后边添加其他别名,并分别设置。
收获:熟悉Aspectj和了解了log4j
评论