Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向Spring非托管bean中注入依赖项_Java_Spring_Spring Boot_Aspectj_Spring Aspects - Fatal编程技术网

Java 向Spring非托管bean中注入依赖项

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是我需要的。我尝试了阵列配置,但似乎无法使任何配置正常工作

我有一个非托管的JPA域类。它通过
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<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>