- 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/
我看到我们有 @org.springframework.context.annotation.ComponentScans 和 @org.springframework.context.annotat
我想向我的 Spring WebApplicationContext 添加一个特定的 Controller 类。我遇到了以下示例:(它是 Scala 中的,但改编自此处: using Componen
场景复现 为了统一定制一个过滤器(Filter),所以在另外一个工程里面创建了一个过滤器,并通过jar包的方法导入当前项目,通过@ComponentScan({"org.example.
我为我的 Spring Application Context 进行了以下设置. @Configuration public class RmiContext { @Bean public R
我正在使用注释设置一个非常小的带有 Boot 的 Spring/REST/JPA 项目。 当我将 JPA 存储库类移到不同的包并在其包上调用 componentscan 时,我在具有 Autowire
我正在使用 Java 11 和 Spring 开发 JavaFX 应用程序。应用程序模块使用 jlink 与自定义 JRE 捆绑在一起,它只允许命名模块包含在 bundle 中。由于 Spring 不
我想找到以编程方式设置“@componentScan”的“basepackages”的方法。 我有这样的东西: @Configuration @EnableWebMvc @ComponentScan(
在我的 Spring Boot 项目中,我必须使用一个外部库,它在 Spring 上下文中定义了 beans。因此,在我的应用程序类中,我在下面添加了我的项目和外部库的基础包, @SpringBoot
@ComponentScan( //CS1 basePackages = {"com.package.A", "com.package.B"}, excludeFilters = @
@ComponentScan 将为您提供包中所有带有 @Component 注释的类的列表(或 @Service/@Repository).为此,我想他们使用反射来枚举包中的所有类并找到带有该注释的类
我的课上有以下 spring header @Service @EnableAutoConfiguration(exclude = {HibernateJpaAutoConfiguration.cla
我对 Spring 比较陌生,并且正在学习一些示例。 在其中一个示例中,我注意到 Spring 没有将 URI 映射到方法。 我发现我将 @ComponentScan 注释放在错误的配置类上并解决了我
我正在关注有关 Spring MVC 的教程,但我无法理解 @ComponentScan 的某些内容即使在阅读了 spring API 文档之后也可以进行注释,所以这里是示例代码: 配置 View C
我不知道如何在测试中排除配置(例如 described here )。我真正想要的是忽略 @WebMvcTest 中的配置,但即使下面的更简单的示例对我来说也不起作用: @ExtendWith(Spr
我有包裹一: xxx.yyy.zzz { SampleClass1.java } 和包二: xxx.yyy.zzz { SampleClass2.java } 并打包三个: aaa.bbb.ccc
“context:componentscan”可以扫描自定义注释吗?如果是这样,扫描后它会将扫描的 bean 存储在应用程序上下文中的什么位置?我如何访问结果? 最佳答案 我们在 XML 配置文件中注
我遇到了 @ComponentScan @Configuration 的问题测试类——即 @ComponentScan无意中拉入 @Configuration在集成测试期间。 例如,假设您在 src/
我有带有包布局的 spring boot 应用程序示例: main: -com.foo Application.java -com.foo.services Item
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 7 年前。 Improve
我想在 Spring 中从基于 XML 的配置切换到基于 Java 的配置。现在我们的应用程序上下文中有这样的东西: 但是如果我写这样的东西...... @ComponentScan
我是一名优秀的程序员,十分优秀!