Java 获取抽象类上的自定义bean

Java 获取抽象类上的自定义bean,java,spring,Java,Spring,我有一个类,它从application.properties获取配置,以创建连接到数据库的驱动器(我使用jdbc连接到我的数据库): 我还有一个名为JdbcDao的抽象类,用于创建连接数据库所需的所有工具: @Component public class JdbcConfiguration { @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.use

我有一个类,它从application.properties获取配置,以创建连接到数据库的驱动器(我使用jdbc连接到我的数据库):

我还有一个名为JdbcDao的抽象类,用于创建连接数据库所需的所有工具:

@Component
public class JdbcConfiguration {

@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String user;
@Value("${spring.datasource.driver-class-name}")
private String driver;
@Value("${spring.datasource.password}")
private String password;

@Bean
public void setUpDriver() {
    DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
    driverManagerDataSource.setUrl(url);
    driverManagerDataSource.setUsername(user);
    driverManagerDataSource.setPassword(password);
    driverManagerDataSource.setDriverClassName(driver);
  }
}
@Component
public abstract class JdbcDao {

@Autowired
private ApplicationContext context;

@Autowired
private JdbcConfiguration jdbcConfiguration;

private JdbcTemplate jdbcTemplateObject;

public JdbcDao() {
    JdbcConfiguration a = context.getBean(JdbcConfiguration.class);
    DriverManagerDataSource driver = context.getBean(DriverManagerDataSource.class);

    this.jdbcTemplateObject = new JdbcTemplate(driver);
}

public JdbcTemplate getJdbcTemplateObject() {
    return jdbcTemplateObject;
 }
}
然后,我得到了jdbc抽象类的具体表示:

public class JdbcUserDao extends JdbcDao implements UserDao {

public JdbcUserDao() {
    super();
}

@Override
public void save(User entity) {
    System.out.println("save");
}

@Override
public void delete(User entity) {
    System.out.println("delete");
}

@Override
public User findById(Long id) {
    return getJdbcTemplateObject().queryForObject(QueryConstants.User.GET_USER_BY_ID, new Object[] { id },
            new UserMapper());
}
}
但是,当我创建新的JdbcUserDao()时,我有一个NPE,因为没有注入应用程序上下文,这会在尝试获取自定义bean时导致空指针

为什么没有注入applicationContext?我怎样才能解决这个问题

编辑:

  • 堆栈跟踪:
java.lang.NullPointerException:null 在com.arqsoft.gorgeousSandwich.data.jdbc.JdbcDao.(JdbcDao.java:25)~[classes/:na] 在com.arqsoft.gorgeousSandwich.data.jdbc.JdbcUserDao.(JdbcUserDao.java:15)~[classes/:na] 在com.arqsoft.gorgeousSandwich.data.DatabaseFactory.getConnectionType(DatabaseFactory.java:20)~[classes/:na] 在com.arqsoft.gorgeousSandwich.services.user.impl.UserService.getUser(UserService.java:18)~[classes/:na] 在com.arqsoft.gorgeousSandwich.controllers.UserController.index(UserController.java:19)~[classes/:na] 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:1.8.0\u 231] 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)~[na:1.8.0\u 231] 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[na:1.8.0\u 231] 在java.lang.reflect.Method.invoke(Method.java:498)~[na:1.8.0\u 231] 在org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.springframework.web.servlet.mvc.method.annotation.ServletinInvocableHandlerMethod.invokeAndHandle(ServletinInvocableHandlerMethod.java:105)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在javax.servlet.http.HttpServlet.service(HttpServlet.java:626)~[tomcat-embed-core-9.0.39.jar:4.0.FR] 在org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)~[spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在javax.servlet.http.HttpServlet.service(HttpServlet.java:733)~[tomcat-embed-core-9.0.39.jar:4.0.FR] 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)~[tomcat-embed-core-9.0.39.jar:9.0.39] 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)~[tomcat-embed-core-9.0.39.jar:9.0.39] 在org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)~[tomcat-embed-websocket-9.0.39.jar:9.0.39] 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)~[tomcat-embed-core-9.0.39.jar:9.0.39] 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)~[tomcat-embed-core-9.0.39.jar:9.0.39] 在org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)~[tomcat-embed-core-9.0.39.jar:9.0.39] 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)~[tomcat-embed-core-9.0.39.jar:9.0.39] 在org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)~[tomcat-embed-core-9.0.39.jar:9.0.39] 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)~[tomcat-embed-core-9.0.39.jar:9.0.39] 在org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE] 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)~[tomcat-embed-core-9.0.39.jar:9.0.39] 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)~[tomcat-embed-core-9.0.39.jar:9.0.39] 位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.j
@Value("${connection.type}")
private String connectionType;

public UserDao getConnectionType() {
    DatabaseConnectionType type = DatabaseConnectionType.getDatabaseConnectionType(connectionType);
    switch(type) {
        case JDBC_CONNECTION:
           return new JdbcUserDao();
        case JPA_CONNECTION:
           return new JpaUserDao();
        default:
            throw new NoDatabaseConfigExceotion(); //EXAMPLE EXCEPTION
    }
}
@Service
 public class UserService implements IUserService {

@Autowired
DatabaseFactory userDatabaseConnection;

@Override
public User getUser(Long id) {
    return userDatabaseConnection.getConnectionType().findById(id);
}
}