Spring 如何获取和设置弹簧&x27;自动连线对象?

Spring 如何获取和设置弹簧&x27;自动连线对象?,spring,Spring,我正在实现JSF+Spring集成web app,我有几个服务类,如下所示: @Service @Transactional public class AccountService { @Autowired private AccountRepository accountRepository; public AccountRepository getRepository() { return account

我正在实现JSF+Spring集成web app,我有几个服务类,如下所示:

@Service
@Transactional
public class AccountService
{
    @Autowired
    private AccountRepository accountRepository;

    public AccountRepository getRepository()
    {                   
        return accountRepository;
    }

    public Account insertOrUpdate(Account entity) 
    {
        return accountRepository.save(entity);
    }

    public Account findOne(Account entiti)
    {
        return accountRepository.findOne(entiti.getId());
    }
    //some other methods
}
@Service
@Transactional
public class BaseService
{
    JpaRepository repository;

    public void setRepository(JpaRepository repository)
    {
        this.repository = repository;
    }

    public BaseEntity insertOrUpdate(BaseEntity entity)
    {
        return (BaseEntity) repository.save(entity);
    }

    public BaseEntity findOne(BaseEntity entity)
    {
        return (BaseEntity) repository.findOne(entity.getId());
    }
}
我想实现一个基类,它包含所有服务类的通用方法,如下所示:

@Service
@Transactional
public class AccountService
{
    @Autowired
    private AccountRepository accountRepository;

    public AccountRepository getRepository()
    {                   
        return accountRepository;
    }

    public Account insertOrUpdate(Account entity) 
    {
        return accountRepository.save(entity);
    }

    public Account findOne(Account entiti)
    {
        return accountRepository.findOne(entiti.getId());
    }
    //some other methods
}
@Service
@Transactional
public class BaseService
{
    JpaRepository repository;

    public void setRepository(JpaRepository repository)
    {
        this.repository = repository;
    }

    public BaseEntity insertOrUpdate(BaseEntity entity)
    {
        return (BaseEntity) repository.save(entity);
    }

    public BaseEntity findOne(BaseEntity entity)
    {
        return (BaseEntity) repository.findOne(entity.getId());
    }
}
但这里的问题是如何动态地自动连接存储库?我尝试从下面的子类设置存储库,但没有成功。当我在super类中使用
存储库
对象时,它将导致
NullPointerException
。有没有关于如何实现这一目标的建议

@Service
@Transactional
public class AccountService extends BaseService
{
    @Autowired
    private AccountRepository accountRepository;

    public AccountService()
    {
        super.setRepository(accountRepository);
    }
}

如果要
获取并设置自动连线对象
并使用
@autowired
注释,则需要在类链接
@Service
@RestController
上使用注释,并在
applicationcontext.xml
文件中使用code
扫描基本包,此bass软件包扫描用于扫描注释。您还可以使用另一种方法,需要使用java类配置创建bean,并为autowire创建对象。在java配置类中,您需要使用
@configuration
注释。您可以找到下面的配置示例代码,我正在为
modelMapper
classs创建bean

@Configuration
public class ModelMapperConfig {

@Bean(name = "modelMapper")
public ModelMapper getModelMapper() {
    ModelMapper modelMapper = new ModelMapper();
    return modelMapper;
}

@Bean(name = "modelMapperWithConverter")
public ModelMapper getModelMapperWithConverter() {
    ModelMapper modelMapper = new ModelMapper();
    return modelMapper;
}
您还可以从XMLCLAS创建bean,您需要将bean创建到
ApplicationContacxt.xml
。您可以在下面找到示例代码:

 <bean id = "advertisementRepo" class = "com.amstech.mayal.demo.test.AdvertisementRepo" />

如果您想
获取并设置自动连线对象
并使用
@autowired
注释,则需要在类链接
@Service
@RestController
上使用注释,并在
applicationcontext.xml
文件中使用code
扫描基本包,此bass软件包扫描用于扫描注释。您还可以使用另一种方法,需要使用java类配置创建bean,并为autowire创建对象。在java配置类中,您需要使用
@configuration
注释。您可以找到下面的配置示例代码,我正在为
modelMapper
classs创建bean

@Configuration
public class ModelMapperConfig {

@Bean(name = "modelMapper")
public ModelMapper getModelMapper() {
    ModelMapper modelMapper = new ModelMapper();
    return modelMapper;
}

@Bean(name = "modelMapperWithConverter")
public ModelMapper getModelMapperWithConverter() {
    ModelMapper modelMapper = new ModelMapper();
    return modelMapper;
}
您还可以从XMLCLAS创建bean,您需要将bean创建到
ApplicationContacxt.xml
。您可以在下面找到示例代码:

 <bean id = "advertisementRepo" class = "com.amstech.mayal.demo.test.AdvertisementRepo" />

这个问题可以通过创建一个通用的基本服务类来解决,如下所示:
BaseService.java,服务方法的接口

public interface BaseService<T extends BaseEntity, ID extends Serializable, R extends JpaRepository>
{
    public T insertOrUpdate(T entity);

    public Iterable<T> insertOrUpdate(Iterable<T> entities);

    public T findOne(ID id);

    public List<T> findAll();

    //.........
}
AccountService.java,最后是您的服务类,它扩展了
BaseServiceImpl

@Service
@Transactional
public class AccountService extends BaseServiceImpl<Account, Integer, AccountRepository> //implements BaseService<Account, Integer, AccountRepository>
{
    @Autowired
    public AccountService(AccountRepository repository) {
        super(repository);
    }

    public AccountRepository getRepository()
    {
        return super.repository;
    }

    //create your own service method here
}
@服务
@交易的
公共类AccountService扩展BaseServiceImpl//实现BaseService
{
@自动连线
公共AccountService(AccountRepository存储库){
超级(储存库);
}
公共AccountRepository getRepository()
{
返回super.repository;
}
//在这里创建您自己的服务方法
}

最后,很抱歉我的英语不好。

这个问题可以通过创建一个通用的基本服务类来解决,如下所示:
BaseService.java,服务方法的接口

public interface BaseService<T extends BaseEntity, ID extends Serializable, R extends JpaRepository>
{
    public T insertOrUpdate(T entity);

    public Iterable<T> insertOrUpdate(Iterable<T> entities);

    public T findOne(ID id);

    public List<T> findAll();

    //.........
}
AccountService.java,最后是您的服务类,它扩展了
BaseServiceImpl

@Service
@Transactional
public class AccountService extends BaseServiceImpl<Account, Integer, AccountRepository> //implements BaseService<Account, Integer, AccountRepository>
{
    @Autowired
    public AccountService(AccountRepository repository) {
        super(repository);
    }

    public AccountRepository getRepository()
    {
        return super.repository;
    }

    //create your own service method here
}
@服务
@交易的
公共类AccountService扩展BaseServiceImpl//实现BaseService
{
@自动连线
公共AccountService(AccountRepository存储库){
超级(储存库);
}
公共AccountRepository getRepository()
{
返回super.repository;
}
//在这里创建您自己的服务方法
}
最后,对不起,我的英语不好