@AspectJ中對目標物件引入新特性,使用註解@DeclareParents
阿新 • • 發佈:2018-12-12
使用時需要引入@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) { } } }