抽象类中注入bean,并且该bean为private的,spring是如何实现注入的 ?

qq_26169787 2016-08-13 01:20:44

在spring工程中定义了抽象类,抽象类中使用注解注入bean,并且该bean为private的,该抽象类的子类使用注解加入到了IOC容器中,private的变量子类无法继承,如果是public的,子类可以继承过去,应该可以通过子类实现注入,但是该bean是声明为private的,spring是如何实现注入的 ?
使用@Resource和@AutoWired的结果是一样的。


包结构如图



spring.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 http://www.springframework.org/schema/context/spring-context-4.2.xsd">

<context:component-scan base-package="dao,service"></context:component-scan>

<bean class="session.Session"></bean>

</beans>


Session定义:

package session;

public class Session {

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

public void update(){
System.out.println("update entity...");
}

}

User:

package session;

public class User {

}


BaseDao定义:

package dao;

public interface BaseDao<T> {

public void save();

public void update();
}



BaseDaoImpl定义:

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

import dao.BaseDao;
import session.Session;

public abstract class BaseDaoImpl<T> implements BaseDao<T>{

@Autowired
private Session session;

@Override
public void save() {
session.save();
}

@Override
public void update() {
session.update();
}

}

UserDao定义:

package dao.impl;

import org.springframework.stereotype.Repository;

import session.User;

@Repository("userDao")
public class UserDaoImpl extends BaseDaoImpl<User>{

}

BaseService定义:

package service;

public interface BaseService<T> {

public void save();

public void update();

}


UserService定义:

package service;

import session.User;

public interface UserService extends BaseService<User> {

}

BaseServiceImpl定义:

package service.impl;

import javax.annotation.Resource;

import dao.BaseDao;
import service.BaseService;

public abstract class BaseServiceImpl<T> implements BaseService<T>{

private BaseDao<T> baseDao;

@Resource
public void setBaseDao(BaseDao<T> baseDao) {
this.baseDao = baseDao;
}

@Override
public void save() {
// TODO Auto-generated method stub
baseDao.save();
}

@Override
public void update() {
// TODO Auto-generated method stub
baseDao.update();
}

}


UserServiceImpl定义:

package service.impl;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import dao.BaseDao;
import service.UserService;
import session.User;

@Service("userService")
public class UserServiceImpl extends BaseServiceImpl<User> implements UserService {

@Resource(name="userDao")
public void setBaseDao(BaseDao<User> baseDao) {
// TODO Auto-generated method stub
super.setBaseDao(baseDao);
}
}


TestCase:

package test;

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

import service.UserService;

public class TestCase {

@Test
public void test() {
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
UserService us = (UserService) ac.getBean("userService");
us.save();
}

}



运行结果
...全文
1593 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
missMeyo 2016-08-13
  • 打赏
  • 举报
回复
去看Spring源码解析。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧