发表于: 2018-03-24 23:00:33

1 703


今天完成的事情:


1.学习spring -AOP

2.使用log4j日志



1.关于Spring 关于AOP

有很多资料可以在网上找到,不说了。只说自己的理解。

Spring,它出现的初衷只有一个目的:简化java开发。

Spring是如何做到简化开发的?Spring所做的一切都或多或少的基于以下四条。

·基于POJO的轻量级和最小侵入性编程

·通过依赖注入和面向接口实现松耦合

·基于切面和惯例进行声名式编程

·通过切面和模板减少样板式代码


之前看了依赖注入(DI:Dependency Injection)和控制反转(IOC:Inversion of Control),因为我会使用到。但是AOP没接触到,所以只知道有这个概念。

今天看了资料,也有点理解什么是AOP(Aspect Oriented Programming):基于切面进行声明式编程。


面向对象编程(OOP)和面向切面编程(AOP),它们有什么不同?

OOP:面向对象,是把每一个需要的事物创建成一个类,然后不断的调用/创建其它类、其它方法最后达到完成我们的目的的方式编程。

AOP:面向切面,就是在每一个类、或者方法需要调用其它类或者方法的时候切入进去,不让它在自己的内部调用,而是在它需要的时候,把需要的这个对象切入进去让你用。


面向对像的时候学的是一个对象,它有属性有动作,会跑会跳会开车。只要给他方法可以用他完成任何事。比如说开车是一个技能方法,把这个技能写进对象里面,他就会开车了。而且我们都会开车,用的是同一种技能。但是我们不会在每个对象下面都写一遍这个方法,这是代码的重复,我们要做的就是简化这种方式,所以我们就把开车这个方法写在其它类里面,这样我们用的时候就可以直接使用这个类去实现这个方法。就是在里面new一个。

但是!new是会访问到里面的所有结构和属性的。如果逻辑复杂属性太多还会造成其它问题。这样耦合性太强了,所以AOP就是就不让他再new了,而是在你需要的时候,在需要的位置切入进去给你用。你该干嘛还干嘛。怎么切入,就是要依靠依赖注入。


·虽然知道概念,但是测试的时候总是报错(不相关的错误,前面写的resource),明天把注解和xml分开继续找错。


例子:

弯弓射大雕,骑马飞射。射之前上马,射之后下马。而具体的弓箭手只需要射箭,不需要管是怎样上下马的(使用aop切入方式)。

具体业务层:

public class SheDiaoImpl implements SheDiao ,Serializable{

   public void jianwuxufa() {
System.out.print("\n 射出亿万箭矢!! \n");
}

}


需要插入的切面层

public class ShediaoStart {

   public void beforeQima(){
System.out.print("飞身上马!\n");
}

   public void afterXiama(){
System.out.print("一波骚操作 \n");
}

}

配置方法:

<bean id="Shediao" class="aopperson.SheDiaoImpl"/>
<bean id="ShediaoStart" class="aopperson.ShediaoStart"/>

<aop:config>
<aop:aspect ref="ShediaoStart">
<aop:pointcut id="shediaoab" expression="execution(public * *(..))"/>
<aop:before method="beforeQima" pointcut-ref="shedqiaoab" />
<aop:after method="afterXiama"  pointcut-ref="shediaqoab"  />
</aop:aspect>
</aop:config>

测试方法(只需要执行就行了,其它不用管):


SheDiaoImpl sheDiao;

@org.junit.Test
public void testShediao(){

sheDiao.jianwuxufa();

}


不使用aop的方式就需要引用对象,这样就需要访问到对象里的所有结构属性,耦合性高:


SheDiaoImpl sheDiao;
ShediaoStart shediaoStart;

@org.junit.Test
public void testShediao(){

shediaoStart.beforeQima();

sheDiao.jianwuxufa();

shediaoStart.afterXiama();


}


2.使用log4j日志


log4j.propertise

### 设置###
# Define the root logger with appender X
log4j.rootLogger = debug,stdout,X,E

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
# Set the appender named X to be a File appender
log4j.appender.X = org.apache.log4j.DailyRollingFileAppender
log4j.appender.X.File = E://logs/log.log
log4j.appender.X.Append = true
log4j.appender.X.Threshold = DEBUG
log4j.appender.X.layout = org.apache.log4j.PatternLayout
log4j.appender.X.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

Test

static Logger logger = Logger.getLogger(Test.class.getName());
   @org.junit.Test
   public void testSelectById(){

//        logger.debug(userMapper.selectById(2));

       System.out.print(userMapper.selectById(3));

//        userMapper.selectById(1);

   }

输出:



明天计划的事情:


·使用aop方式 测试

·继续学习spring


遇到的问题:


·在一个配置文件中配置多个组件可能出现的问题

·不相关的组件(类),使用不同方式注册bean可以分开写/比如数据库连接和其它业务逻辑


收获:


·spring的理念和aop的概念

·注解和xml可以二选一也可以混合配置

·日志的简单设置




返回列表 返回列表
评论

    分享到