spring使用问题

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();
                }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值