Spring中的泛型依赖注入


引言:

Spring可以为子类注入子类对应的泛型类型的成员变量的引用

  • User.java
  • BaseService.java
  • UserService.java
  • BaseRepository.java
  • UserRepository.java
  • Main.javva
  • beans-generic-di.xml

User.java

package com.yczlab.spring.beans.generic.di;

public class User {

}

BaseService.java

package com.yczlab.spring.beans.generic.di;

import org.springframework.beans.factory.annotation.Autowired;

public class BaseService<T> {

    //该注解会被子类继承
    @Autowired
    protected BaseRepository<T> repository;

    public  void add() {
        System.out.println("add...");
        System.out.println(repository);
    }

}

UserService.java

package com.yczlab.spring.beans.generic.di;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

//父类没有加入Spring的自动管理,子类使用@Service注解加入Spring的自动管理
@Service
public class UserService extends BaseService<User> {
    //继承@AutoWired注解后,会自动配置好BaseRepository<User>类型的实例Bean
    //相当于如下代码:
    /*
    @Autowired
    protected BaseRepository<User> repository;
    **/
}

BaseRepository.java

package com.yczlab.spring.beans.generic.di;

public class BaseRepository<T> {

}

UserRepository.java

package com.yczlab.spring.beans.generic.di;

import org.springframework.stereotype.Repository;

//父类没有加入Spring的自动管理,子类使用@Repository注解加入Spring的自动管理
@Repository
public class UserRepository extends BaseRepository<User> {
}

Main.javva

package com.yczlab.spring.beans.generic.di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans-generic-di.xml");

        UserService userService = (UserService) context.getBean("userService");
        userService.add();
    }
}

beans-generic-di.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.yczlab.spring.beans.generic.di"/>

</beans>

文章作者: YangChongZhi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 YangChongZhi !
评论
 上一篇
Spring中使用动态代理解决日志需求 Spring中使用动态代理解决日志需求
引言: 使用动态代理技术实现在类的方法中加入日志信息。通过动态代理的方式写入日志信息不会给原来的类带来代码混乱和分散的问题,便于维护 ArithmeticCalculator.java ArithmeticCalculatorImpl.
2020-03-09
下一篇 
Spring中使用注解配置Bean(2),使用@Autowired注解自动装配属性 Spring中使用注解配置Bean(2),使用@Autowired注解自动装配属性
引言: 在Spring的配置文件中使用<context:component-scan>元素时,会自动注册 AutowireAnnotationBeanPostProcesser 实例,该实例会自动装配具有 @Autowired
2020-03-08
  目录