1. 程式人生 > >java框架之spring(五)

java框架之spring(五)

註解方式 AOP

本章節把XML方式配置AOP改造為註解方式

1、註解配置業務類

使用@Component("hjsy2") 註解ProductService 類

package com.hjsy.service;
import org.springframework.stereotype.Component;
@Component("hjsy2")
public class ProductService {
	public void doSomeService(){
        System.out.println("doSomeService");
    }
}
2、註解配置切面

@Aspect 註解表示這是一個切面
@Component 表示這是一個bean,由Spring進行管理
@Around(value = "execution(* com.hjsy.service.ProductService.*(..))") 表示對com.hjsy.service.ProductService 這個類中的所有方法進行切面操作

package com.hjsy.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggerAspect {
	@Around(value = "execution(* com.hjsy.service.ProductService.*(..))")
	public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("start log:" + joinPoint.getSignature().getName());
        Object object = joinPoint.proceed();
        System.out.println("end log:" + joinPoint.getSignature().getName());
        return object;
    }
}
3、修改applicationContext.xml檔案

去掉原有資訊,新增如下3行:

<context:component-scan base-package="com.hjsy.aspect"/>
<context:component-scan base-package="com.hjsy.service"/>
掃描包com.hjsy.aspect和com.hjsy.service,定位業務類和切面類
<aop:aspectj-autoproxy/>  
找到被註解了的切面類,進行切面配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
   http://www.springframework.org/schema/context     
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">
   <context:component-scan base-package="com.hjsy.aspect"/>
   <context:component-scan base-package="com.hjsy.service"/>
   <aop:aspectj-autoproxy/>  
</beans>
4、測試,執行測試類輸出結果

package spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.hjsy.pojo.Category;
import com.hjsy.pojo.Product;
import com.hjsy.service.ProductService;

public class TestSpring {
	public static void main(String[] args) {
		ApplicationContext context1 = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
		ProductService s = (ProductService) context1.getBean("hjsy2");
       	 	s.doSomeService();
	}
}


5、註解方式測試

註解方式用到了junit,用到了以下兩個jar包,在專案lib目錄下
junit-4.12.jar和hamcrest-all-1.3.jar

6、修改測試類

修改TestSpring.java, 並執行
1. @RunWith(SpringJUnit4ClassRunner.class) 
表示這是一個Spring的測試類

2. @ContextConfiguration("classpath:applicationContext.xml")
定位Spring的配置檔案

3. @Autowired
給這個測試類裝配Category物件

4. @Test
測試邏輯,列印Category物件的名稱

package spring;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.hjsy.pojo.Category;
import com.hjsy.pojo.Product;
import com.hjsy.service.ProductService;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestSpring {
//	public static void main(String[] args) {
//		ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
//		Category category = (Category) context.getBean("hjsy");
//		System.out.println(category.getName());

//		ApplicationContext context1 = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
//		Product product = (Product) context1.getBean("hjsy1");
//		System.out.println(product.getName());
//		System.out.println(product.getCategory().getName());
		
//		ApplicationContext context2 = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
//		ProductService s = (ProductService) context2.getBean("hjsy2");
//        	s.doSomeService();
		@Autowired
		Category c;
		@Test
		public void test(){
			System.out.println(c.getName());
		}
//	}
}


原始碼:連結:https://pan.baidu.com/s/1o9lqtlg 密碼:e191