1.对于实现了接口的类,用的jdk动态代理,此时如果用AutoWired是按照class的全路径匹配的,而动态代理返回的代理类是接口的子类,此时会有类型转换错误,可以改为 @Qualifier或者用set注入
public class UserServiceImpl implements UserService {}
public class UserServiceImpl2 {
private JdbcTemplate jdbcTemplate;
@Autowired //这种的报错
private UserServiceImpl userServiceImpl1;
}
2.spring中获取单例bean的方式,使用于一些非依赖注入的场景,比如工具类中的static属性但还要引用spring中的bean的情况,不过还是最好以依赖注入的方式获取bean
参考:iteye.com/blog/ydlmlh-1128687
通用的情况:
(1)继承自抽象类ApplicationObjectSupport
说明:
抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContextcontext)方法将ApplicationContext 对象注入。
@Component
public class SpringUtil extends ApplicationObjectSupport{
private ApplicationContext context;
context = this.getApplicationContext();
}
//使用的时候也要以bean的形式获取其上下文对象,如果是非bean,如new,则无法获得上下文,spring只会管理自己容器的bean
@Autowired
SpringUtil springUtil;
public String hello() {
ApplicationContext ap = springUtil.context;
}
(2)实现接口ApplicationContextAware
实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext 对象注入,这个方法可以用在静态方法中,即可以单独做一个工具类,来获取spring的bean
//必须是bean,spring才会调用下面的set实现方法,spring不会理会非bean的对该方法的实现
@Component
public class TestController implements ApplicationContextAware {
private Jedis jedis = null;
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext context){
this.context = context;
}
}
(3)直接给一个 ApplicationContext applicationContext 作为属性,然后从中获取bean
@Component
public class FlowUtils {
static TransferService iService;
这种只能要求当前实例所在线程中所有实例也=都是spring管理的,不太好用
@Autowired
ApplicationContext applicationContext;
function(){
iService = applicationContext.getBean(TransferService.class);
}
}
(4)通过set方法延迟给类变量赋值:
@Component
public class FlowUtils {
private static CommonBO commonBO;
@Autowired
public void setCommonBO(CommonBO commonBO){
FlowUtils.commonBO = commonBO;
}
}
(5)通过@PostConstruct
@RestController
@RequestMapping("/transferController")
public class Controller {
static TransferService iService;
@Autowired
ApplicationContext applicationContext;
@PostConstruct 在依赖注入完成后初始化的方法
public void init(){
iService = applicationContext.getBean(TransferService.class);
}
}
ps:以上方法本质都是延迟赋引用,在spring容器完全启动后,想办法拿到其中的实例赋值给类变量
3.spring项目中手动从连接池中获取连接
/**
* 直接从Druid中获得数据库连接
*/
这里的DataSource是包 javax.sql提供的,是所有数据源的顶级接口,只要有接口实现,就直接可依赖注入;
这里是使用的druid数据源连接池,获得的实例对象是是druid中的对象
@Autowired
private DataSource dataSource;
使用:
Connection connection = dataSource.getConnection();
if(connection != null){
//归还连接而非真正关闭数据库连接
connection.close();
}