Java自学之路-Java中级教程-6:Spring面向切面AOP以及配置

AOP(Aspect Oriented Programming),即面向切面编程。


OOP(Object Oriented Programming),即面向对象编程。


面向切面和面向对象都要理解切面和对象的概念。对象是类的实例,切面是把对象的方法进行横向扩展。


最简单的面向切面,就是计算方法执行的时间。比如,前面介绍了连接数据库并查询记录,要知道这个过程用多长时间,就可以给这段程序加上计算时间的代码。


新建一个类PersonDataAccessObject,包名为com.helloworld.dao。在这个类中,建一个方法getPersonList(),把前面数据库获取数据记录的程序放进方法体中,并返回记录的列表。


package com.helloworld.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.helloworld.Person;


public class PersonDataAccessObject {

	public List getPersonList() throws Exception {

		Class.forName("com.mysql.jdbc.Driver");

		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/newdb", "root", "root");

		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery("select * from new_table");

		List personList = new ArrayList();
		while (rs.next()) {
			Person person = new Person();
			person.setId(rs.getInt(1));
			person.setNation(rs.getString(2));

			personList.add(person);

		}

		return personList;

	}

}



新建一个xml名为applicationContext-dao.xml,并放于PersonDataAccessObject类同一个包中,即com.helloworld.dao包中。在这个xml中注入PersonDataAccessObject的实例bean,id="personDao"。


新建一个类SpringContextMain,在main()方法中获取这个personDao的bean,并调用getPeronList()方法来打印所有数据记录。


import java.util.List;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.helloworld.Person;
import com.helloworld.dao.PersonDataAccessObject;

public class SpringContextMain {

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub

		ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("com/helloworld/dao/applicationContext-dao.xml");
		PersonDataAccessObject personDao = (PersonDataAccessObject) ac.getBeanFactory().getBean("personDao");

		List personList = personDao.getPersonList();
		for (int i = 0; i < personList.size(); i++) { Person person = (Person) personList.get(i); System.out.println("person.getNation():" + person.getNation()); } } } 



打印结果为:

person.getNation():UK2
person.getNation():UK2

要加入计算方法getPersonList()执行时间的代码也很简单,基本思想就是先在方法执行的开始获取开始时间,后面在方法结束的时候获取结束时间,两个时间的差就是要的结果。


	public List getPersonList() throws Exception {

		long timeStart = System.currentTimeMillis();

		Class.forName("com.mysql.jdbc.Driver");

		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/newdb", "root", "root");

		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery("select * from new_table");

		List personList = new ArrayList();
		while (rs.next()) {
			Person person = new Person();
			person.setId(rs.getInt(1));
			person.setNation(rs.getString(2));

			personList.add(person);

		}

		long timeEnd = System.currentTimeMillis();

		long timeMethod = timeEnd - timeStart;

		System.out.println("timeMethod:" + timeMethod + "ms");

		return personList;

	}


打印结果为:

timeMethod:841ms


也就是方法执行时间为841毫秒。这里在getPersonList()方法中写入了计算时间的逻辑,事实上因为这个程序可以编辑就可以加入任何代码语句,如果要计算spring包里的某个方法,用这种直接编辑再运行的方法就力不从心了,因为源代码封装在jar包里了。


Spring的面向切面编程AOP可以做到在某个方法执行时加入额外的逻辑,比如上面计算方法getPersonList()的运行时间。Spring AOP需要引入aspectj的类库,这个包可以在eclipse官网下载到。下载后将jar包解压缩,在目录lib中有很多jar包,通过Add External Jars把这些jar包放到Build Path中。

http://www.eclipse.org/aspectj/downloads.php

http://ftp.jaist.ac.jp/pub/eclipse/tools/aspectj/aspectj-1.8.13.jar


新建一个类SpringAop,如下。


package com.helloworld.aop;

public class SpringAop {

	private long timeStart;

	private long timeEnd;

	public void startCode() {
		timeStart = System.currentTimeMillis();
	}

	public void endCode() {
		timeEnd = System.currentTimeMillis();
		System.out.println("timeEnd - timeStart: " + (timeEnd - timeStart));
	}

	private void pointcutMethod() {

	}

}


applicationContext-dao.xml中,引入aop的标签并配置。


在aop:config中,有两个主要的标签,pointcut与aspect。pointcut为切入点,是指在哪些方法上执行AOP,属性expression="execution(* com.helloworld.dao.*.*(..))"就是规定了dao包中的所有方法都执行AOP。aspect为切面,是指执行的AOP逻辑在哪个类对象里,这里ref指向SpringAop类的对象。aspect标签中的before和after即是在哪个pointcut执行在哪个方法,这里配置在daoAop这个pointcut中的所有方法前执行startCode方法,所有方法后执行endCode方法


执行结果为:

timeEnd - timeStart: 696


这个结果和在方法中直接加入计算逻加代码是差不多的作用,方法执行的时间即可不用修改代码就得到。







阅读更多
个人分类: Java中级教程
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Java自学之路-Java中级教程-6:Spring面向切面AOP以及配置

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭