- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一组简单的类来向 friend 展示如何使用 Annotations for AOP(而不是 xml 配置)。我们无法让 @ComponentScan 工作,并且 AnnotationConfigApplicationContext getBean 行为也很不正常。我想了解两件事。请参阅下面的代码:
PersonOperationsI.java
package samples.chapter3;
import org.springframework.stereotype.Component;
@Component
public interface PersonOperationsI {
public String getName();
}
/**
*
*/
package samples.chapter3;
import org.springframework.stereotype.Component;
@Component
public class PersonOperations implements PersonOperationsI {
public String getName() {
return "";
}
}
package samples.chapter3;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
//question2 - Below Component Scan didnt work - Test Case failing in setup()
//@ComponentScan(basePackages = {"samples.chapter3"})
@EnableAspectJAutoProxy
public class PersonOperationsConfigClass {
}
/**
*
*/
package samples.chapter3;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class PersonOperationsAdvice {
/**
* execution( [Modifiers] [ReturnType] [FullClassName].[MethodName]
([Arguments]) throws [ExceptionType])
* @param joinPoint
* @return
*/
@Before("execution(public * samples.chapter3.PersonOperations.getName()))")
public String beforeGetName(JoinPoint joinPoint) {
System.out.println("method name = " + joinPoint.getSignature().getName());
return null;
}
}
package samples.chapter3;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = { PersonOperationsConfigClass.class })
public class PersonOperationsTest {
//@Autowired
private PersonOperationsI obj;
@Before
public void setUp() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.scan("samples.chapter3");
ctx.refresh();
obj = ctx.getBean(PersonOperationsI.class);
//obj = ctx.getBean(PersonOperations.class);//getBean of Child class not working - why ?
Assert.assertNotNull(obj);
ctx.close();
}
@Test
public void test() {
System.out.println(obj.getName());
}
}
最佳答案
A1 , @ComponentScan
没用,因为它被 "The component classes to use for loading an ApplicationContext." 注释掉了或 PersonOperationsConfigClass
@Configuration
//@ComponentScan(basePackages = {"samples.chapter3"})
@EnableAspectJAutoProxy
public class PersonOperationsConfigClass {}
@Autowired
失败的。
AnnotationConfigApplicationContext
在带有
@Before
注释的方法中使用,以编程方式创建了一个 ApplicationContext。
ctx.scan("samples.chapter3");
扫描并自动检测
PersonOperations
注释为
@Component
.
obj
使用代码
obj = ctx.getBean(PersonOperationsI.class);
设置引用.该对象不是“ Autowiring ”的。
obj
是 Autowiring 的,不为空。我用了对应的
annotations从 6 月 5 日开始。
package rg.app.aop.so.q1;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes= {PersonOperationsConfigClass.class})
public class PersonOperationsTest {
@Autowired
private PersonOperationsI obj;
@BeforeEach
public void setUp() {
System.out.println("init ::"+ obj);
Assertions.assertNotNull(obj);
}
@Test
public void testPersonOps() {
Assertions.assertNotNull(obj);
}
}
package rg.app.aop.so.q1;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = {"rg.app.aop.so.q1"})
public class PersonOperationsConfigClass {
}
@EnableAspectJAutoProxy
proxyTargetClass
的默认值“false”属性。此属性决定代理机制:JDK 代理 (false) 或 CGLIB 代理 (true)。
@EnableAspectJAutoProxy
/
@EnableAspectJAutoProxy(proxyTargetClass = false )
ctx.getBean(InterfaceType)
返回一个 bean ctx.getBean(ImplementationClassType)
无法返回 bean @EnableAspectJAutoProxy(proxyTargetClass = true )
ctx.getBean(InterfaceType)
返回一个 bean ctx.getBean(ImplementationClassType)
返回一个 bean @EnableAspectJAutoProxy
没有注释
ctx.getBean(InterfaceType)
返回一个 bean ctx.getBean(ImplementationClassType)
返回一个 bean proxyTargetClass
启用作为假。 JDK 代理创建一个接口(interface)类型的代理 bean。
proxyTargetClass
启用一样真实。 CGLIB 通过子类化带有
@Component
注释的类来创建代理 bean。 .
@EnableAspectJAutoProxy
如果不存在,则会为带有
@Component
注释的类创建一个 bean没有任何代理。
package rg.app.aop.so.q1;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class AppMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.scan("rg.app.aop.so.q1");
ctx.refresh();
System.out.println();
for(String name:ctx.getBeanNamesForType(PersonOperationsI.class)) {
System.out.println(name);
}
for(String name:ctx.getBeanNamesForType(PersonOperations.class)) {
System.out.println(name);
}
PersonOperationsI obj = ctx.getBean(PersonOperationsI.class);
System.out.println(obj.getClass());
obj = ctx.getBean(PersonOperations.class);
System.out.println(obj.getClass());
ctx.registerShutdownHook();
}
}
personOperations
class com.sun.proxy.$Proxy18
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'rg.app.aop.so.q1.PersonOperations' available
personOperations
personOperations
class rg.app.aop.so.q1.PersonOperations$$EnhancerBySpringCGLIB$$c179e7f2
class rg.app.aop.so.q1.PersonOperations$$EnhancerBySpringCGLIB$$c179e7f2
personOperations
personOperations
class rg.app.aop.so.q1.PersonOperations
class rg.app.aop.so.q1.PersonOperations
关于Java aop ComponentScan 不工作 & AnnotationConfigApplicationContext getBean 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59763488/
我使用的是Spring3.1 我已经以编程方式注册了一个 Bean,我也想以编程方式检索它,但没有成功。 public void createBean(String beanName, String
我正在使用方法ApplicationContext.getBean(String name, Class requiredType)。该 bean 的类型为 util:set。我的代码如下所示: Se
getBean() 方法在这里做什么,它在程序中如何工作? ApplicationContext aplicntxt = new ClassPathXmlApplicationContext("spr
我正在使用方法 ApplicationContext.getBean(String name, Class requiredType)。 bean 的类型为 util:set。我的代码如下: Set
我有一个界面 @Component("a") @Scope("prototype") Public interface A{ ..... } 和实现接口(interface)a的b类 public c
我不明白为什么我的集成测试会抛出异常。 集成测试## package sample import grails.test.mixin.* import org.junit.* /** * See t
当我使用 getBean("test") 我有一门课 @Component public class TEST { } 这个 bean 可以加载吗? 最佳答案 getBean() 是区分大小写的,但是
这里我有一个名为 RegionsServiceImpl 的带有 @Service 的主类。我正在使用 ApplicationContext.getBean 对其进行初始化,但我想使用 @Autowir
我使用的是 Jackson 自定义序列化器,已知该序列化器不支持 Spring 依赖项注入(inject),因此我的序列化器类如下: public class ShippingAddressDataS
我正在浏览 spring 文档,并发现了以下声明 - You can then use getBean to retrieve instances of your beans. The Applica
我有一个 Spring Boot 应用程序。当我调用 context.getBean(MyController.class) 时,它工作正常。当我调用 context.getBean("MyContr
由于依赖注入(inject)意味着控制反转,因此我在以下调用中看不到 IOC: Car car = (Car)ApplicationContext.getBean("car"); 这不是 Spri
ReadOnlyProperty.getBean() 的 Javadoc 是这样说的: Object getBean() Returns the Object that contains this p
我正在尝试从 Solr 转到 Elasticsearch,我一直在将我使用 Solr 工作的一些类转换为 Elasticsearch,但现在我陷入了困境。 在 Solr 中我曾经有: QueryRes
在一个spring应用中,我们是这样写的,通过手动加载spring应用上下文来获取一个bean。 ApplicationContext context = new ClassPathXmlApplic
我有一个类 Bar 实现如下: class Bar implements ApplicationContextAware { ApplicationContext applicationCon
我在我的应用程序中使用 SpringBoot,目前正在使用 applicationContext.getBean(beanName,beanClass) 在执行操作之前获取我的 bean。我在几个问题
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { Job job = ctx.g
我在 Spring 中有一个 bean 定义,它是代理对应物,可以在任何地方使用: someInterceptor 一切正常;在
我正在使用 JSF + Spring+ Hibernate protected @Inject ChartOfAccount chartOfAccount; 我基本上想从列表中填充 chartOfAc
我是一名优秀的程序员,十分优秀!