1. 程式人生 > >@AspectJ中對目標物件引入新特性,使用註解@DeclareParents

@AspectJ中對目標物件引入新特性,使用註解@DeclareParents

使用時需要引入@AspectJ的jar包,官網下載即可.

@DeclareParents 標註此屬性,要引入功能,即引入的介面
value

指定哪種型別的bean引入該介面.

其中符號`+`,表示該介面的所有子類.

defaultImpl 指示,引入功能(即引入介面)的預設實現類.

目標物件的介面和實現類

package siye;
public interface User
{
	public void work();
}
package siye;
import org.springframework.stereotype.Component;
@Component
public class UserImpl implements User
{
	@Override
	public void work()
	{
		System.out.println("user_work");
	}
}

引入目標物件的介面和類

package siye;
public interface Animal
{
	public void eat();
}
package siye;
import org.springframework.stereotype.Component;
@Component
public class AnimalImpl implements Animal
{
	@Override
	public void eat()
	{
		System.out.println("animal_eat");
	}
}

切面引入類

package siye;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class AspectInstruction
{
	/*
	 * @AspectJ註解驅動
	 * 引入功能時,必要使用介面,使用類的話,無法實現.
	 */
	@DeclareParents(value = "siye.User+",
			defaultImpl = AnimalImpl.class)
	public Animal animal;
}

配置類

package siye;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
@EnableAspectJAutoProxy
public class ConfigClass
{
}

測試類

package siye;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
 * S2,AspectJ註解驅動.
 * 1,介面宣告,實現類.
 * 2,S2,DeclareParent
 * 3,獲取使用bean名稱.
 *
 */
public class UnitTest
{
	public static void main(String[] args)
	{
		String packName = UnitTest.class.getPackage().getName();
		AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext();
		context.scan(packName);
		context.register(ConfigClass.class);
		context.refresh();
		/*
		 * Exception in thread "main"
		 * org.springframework.beans.factory.NoSuchBeanDefinitionException: No
		 * qualifying bean of type 'std_anno_DeclareParents.UserImpl' available
		 * 此處獲取bean的方式,採取bean名稱的方式.
		 */
		// User user = (User) context.getBean(UserImpl.class);
		User user = (User) context.getBean("userImpl");
		user.work();
		Animal animal = (Animal) user;
		animal.eat();
		try
		{
			Thread.sleep(3000);
			context.close();
		} catch (Exception e)
		{
		}
	}
}