Java 向Spring非托管bean中注入依赖项
我有一个非托管的JPA域类。它通过Java 向Spring非托管bean中注入依赖项,java,spring,spring-boot,aspectj,spring-aspects,Java,Spring,Spring Boot,Aspectj,Spring Aspects,我有一个非托管的JPA域类。它通过new操作符实例化 UserAccount account = new UserAccount(); userRepository.save(account) 在我的UserAccount类中,我有一个beforeSave()方法,它依赖于我的SecurityService对密码进行哈希编码 我的问题是“如何让SpringDI将安全服务注入我的实体?”。似乎AspectJ和LoadTimeWeaving是我需要的。我尝试了阵列配置,但似乎无法使任何配置正常工作
new
操作符实例化
UserAccount account = new UserAccount();
userRepository.save(account)
在我的UserAccount
类中,我有一个beforeSave()
方法,它依赖于我的SecurityService
对密码进行哈希编码
我的问题是“如何让SpringDI将安全服务注入我的实体?”。似乎AspectJ和LoadTimeWeaving是我需要的。我尝试了阵列配置,但似乎无法使任何配置正常工作。在尝试调用注入对象上的方法时,我总是得到一个NullPointerException
UserAccount.java(这是JPA实体)
试图指示spring使用AspectJ:
NitroApp.java(主类)
build.gradle(配置)
您可以在用于实例化UserAccount的类中注入Spring applicationContext
@Autowired
private ApplicationContext applicationContext;
然后,通过以下方式创建UserAccountbean:
UserAccount userAccount = applicationContext.getBean(UserAccount.class);
通过这种方式,您可以将所需的依赖项注入UserAccount类。从您的配置中,我假设您希望Spring为您管理AOP。但是,由于您希望在非托管bean上使用
@Autowired
,因此您必须通过加载时编织或编译团队编织自己进行编织。默认情况下,Spring只支持方法级方面
因为加载时编织涉及到javaagent的使用,如中所述(在生产场景中并不总是实用),所以我使用了编译时编织。下面的代码和配置适合我
启动配置
@SpringBootApplication
@EnableSpringConfigured
public class App {
public static void main(String[] args) {
System.out.println("Hello World!");
ApplicationContext ctx = SpringApplication.run(App.class, args);
Account account = new Account();
account.testConfigurable();
}
}
Account.java
@Configurable(autowire = Autowire.BY_TYPE, dependencyCheck = true)
public class Account {
@Autowired
private SpringService service;
public void testConfigurable() {
System.out.println(service.returnHello());
}
}
@Service
public class SpringService {
public String returnHello() {
return "Hello";
}
}
SpringService.java
@Configurable(autowire = Autowire.BY_TYPE, dependencyCheck = true)
public class Account {
@Autowired
private SpringService service;
public void testConfigurable() {
System.out.println(service.returnHello());
}
}
@Service
public class SpringService {
public String returnHello() {
return "Hello";
}
}
丑陋的pom.xml
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<showWeaveInfo>true</showWeaveInfo>
<source>1.8</source>
<target>1.8</target>
<Xlint>ignore</Xlint>
<complianceLevel>1.8</complianceLevel>
<encoding>UTF-8</encoding>
<verbose>false</verbose>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.5</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.8.5</version>
</dependency>
</dependencies>
</plugin>
org.codehaus.mojo
春天的医生
Maven配置来自
因为我不是AOP方面的专家,所以我不确定在普通方面以上述方式配置AOP的连锁反应。讨论。如果加载时编织是您的一种选择,您应该按照回答中的讨论继续使用它。您是否按照中的说明在运行应用程序时正确启用加载时编织?@dunni我在4.1.6.RELEASE的文档中有。谢谢您的回答,您是对的!话虽如此,我还是想继续使用new
操作符,因为在成千上万的实例中,我将实例化这些对象,而且我更愿意以直观的方式来实现。我特别在寻找一种AOP方法来实现它。我仍然在passwordHash=securityService.hashPassword(password)上获得NPE你能详细说明一下吗?既然你想使用新的接线员,请忽略我先前的回答。事实上,我重写了答案,并在使用新操作符时成功地实现了依赖项注入。我可以使用aspectj插件查看您的gradle脚本。这是用于编译时编织的吗?以防答案似乎解释得太多。。我只是想写下我是如何得出答案的,以便更清楚地表达。。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<showWeaveInfo>true</showWeaveInfo>
<source>1.8</source>
<target>1.8</target>
<Xlint>ignore</Xlint>
<complianceLevel>1.8</complianceLevel>
<encoding>UTF-8</encoding>
<verbose>false</verbose>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.5</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.8.5</version>
</dependency>
</dependencies>
</plugin>