######Spring第5天ssh整合(注解版)难理解知识点:【自定义 方法加注解的方式】给dao注入sessionFactory属性+【搞清@Autowared和@Resource含义】
来源:互联网 发布:合肥网络总监招聘 编辑:程序博客网 时间:2024/05/16 06:41
===【方法加注解的方式】给dao注入sessionFactory属性(继承父类的属性),第一次见!===具体怎么用的,看源码。(后面有写)
以前都是属性+注解注入属性。
===@Autowared和@Resource到底是干嘛的?
刚学IOC时可能能够立马说出,是
IOC注解方式:引入外部对象的,维护对象间依赖关系的。
===ps:IOC xml方式 是在<bean>的property属性里设置另一个bean作为属性。bean间依赖。通过属性注入。===直观简单易懂。
但是使用IOC注解方式,也只不过是:
把<bean>配置删掉,换成类上的 @Component、@Repository、@Service、@Controller,
再在上一层类中(比如service注入dao对象 service是上一层对象) 声明一个被注入类的对象属性,并且加上@Autowared或@Resource注解即可。
IOC注解方式就是这么简单。
===但是 当时没有深入思考,并多加练习。理解不深刻。导致现在很容易就忘了。
不像 IOC xml方式简单明了,想忘都忘不了!就是属性注入。
===小结①:
①【属性注入就是IOC,IOC就是属性注入】。
②不管直观的xml方式,还是有点抽象的注解方式。
===【属性注入本质】都是两步:【①创建对象,②调用一个对象的set方法 注入 另一个对象】
===小结②:IOC注解方式:
①创建对象,
===就是:(对【应属性注入的本质工作】第一步)
在我们需要在spring xml配置里写<bean>的类上 加上: @Component、@Repository、@Service、@Controller,
//===注解不带任何属性,bean名称默认是类名首字母小写。
===###==service、dao只需要是单例,spring默认创建对象也是单例。所以不用配置属性。
===###==service在注入dao时,使用:@Autowared就行:通过类型自动匹配。不需要加任何注解属性。
②调用一个对象的set方法 注入 另一个对象,
===就是:(对【应属性注入的本质工作】第二步)
案例: service声明一个dao类的对象(被注入对象)属性,并且在属性上加注解:加上@Autowared或@Resource注解即可。
@Autowared 最好用。
@Resource最好写上注解属性name="bean ID"。===不写属性,默认的匹配规则不清楚。一般不这样用。
======前面可能看起来还很简单。
service注入dao经典,烂熟,很简单。
但是使用jdbc:dao注入 dataSource属性(C3p0、dbcp等数据库),jdbcTemplate属性,熟练使用【IOC 注解方式 注入属性】,也还好。。
后面遇到SSH整合时,
使用dao注入sessionFactory: 这就有点晕了。是很晕。
原因总结如下:
①spring配置文件里,有一个sessionFactory,但不是org.hibernate.SessionFactory。
<!-- sessionFactory :整合hibernate方式2:在spring中配置hibernate属性 --><bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >②重头戏来了:dao注入sessionFactory:
第一眼我绝对看不懂。
后来对比jdbc 方式:继承JdbcDaoSupport,总结了一下:
要注入sessionFactory(jdbc里是DataSOurce),首先要知道:
①sessionFactory是spring给我们创建的。===jdbc的DataSource也是。
//===【HibernateDaoSupport的getHibernateTemplate()源码】:
//因为现在HibernateTemplate肯定是null,所以会调用HibernateDaoSupport的createHibernateTemplate();
//createHibernateTemplate(sessionFactory)源码:调用new HibernateTemplate(sessionFactory);
//HibernateTemplate构造方法会调用setSessionFactory(sessionFactory)。
//===总之HibernateTemplate的setSessionFactory(sessionFactory),参数是传过来的 HibernateDaoSupport的sessionFactory属性。
//===也就是dao的父类的sessionFactory属性。
②getHibernateTemplate()创建hibernateTemplate对象时,内部将SessionFactory注入到了hibernateTemplate。
dao注入SessionFactory就是传 给HibernateTemplate用的,用来创建hibernateTemplate。
虽然getHibernateTemplate()无参数,spring底层可能是用构造函数传入SessionFactory属性的方式 接收到当前项目的SessionFactory的。不用管。
===总之:######【dao要注入sessionFactory,就是在dao类里 调用父类的setSessionFactory(SessionFactory sf)方法即可。(已测)】
######因为:因为【只有父类HibernateDaoSupport(API)的setSessionFactory(sessionFactory)《才能成功注入》spring自动为我们创建的sessionFactory】。
====最终还是因为 【sessionFactory对象是:spring自动为我们创建。】
自定义属性,无法注入(匹配到)spring创建的sessionFactory。
所以我们不能自己在dao写一个没有调用父类setSessionFactory(sessionFactory)的 setSessionFactory(sessionFactory)方法。
==######=下面是测试案例,随意一个 加了@Autowired的方法,lalala(sessionFactory),
只要调用了super. setSessionFactory(sessionFactory)。
运行都ok
图片二:
=====通过以上学习总结:
spring的IOC(就是属性注入),并不是那么简单的。还要多留心。
====终极问题结论:【@Autowared和@Resource只是注入属性】,只相当于set方法,【###不能创建对象】。
###spring再牛,也不能单凭一个属性名就能创建对象。
- ######Spring第5天ssh整合(注解版)难理解知识点:【自定义 方法加注解的方式】给dao注入sessionFactory属性+【搞清@Autowared和@Resource含义】
- 注解的方式注入org.hibernate.SessionFactory到自定义的Dao中
- 注解的方式注入org.hibernate.SessionFactory到自定义的Dao中
- 通过注解的方式向DAO中注入Sessionfactory
- SSH整合 DAO注入sessionfactory的方式汇总
- Spring的注解注入方式@Autowired,@Resource
- 通过注解方式向Dao中注入Sessionfactory
- 通过注解方式向Dao中注入Sessionfactory
- 注解方式配置SessionFactory的注入
- SSH向Dao接口的实现类中用注解和声明方式注入创建HibernateTemplate对象
- Spring--IoC--域属性的注入-使用@Resource注解(JSR)
- ssh 中用注解和不用注解两重sessionFactory获得方式
- ssh框架注解方式持久层无法注入sessionFactory解决方法
- SSH整合加注解
- 有关spring的依赖注入和@resource注解的使用
- Ibatis,Spring整合(注解方式注入)
- Ibatis,Spring整合(注解方式注入)
- Ibatis,Spring整合(注解方式注入)
- 字符型和String类型总结
- BlueBorne 蓝牙漏洞深入分析与PoC
- strtok函数
- 机器学习概念总结笔记(四)——KMeans、混合高斯模型、LDA、PLSA、Apriori、FP-Growth、
- Python与matlab在存储三维数组上的区别
- ######Spring第5天ssh整合(注解版)难理解知识点:【自定义 方法加注解的方式】给dao注入sessionFactory属性+【搞清@Autowared和@Resource含义】
- Gradle的基本配置和依赖管理
- next() 和 nextLine() 的 区别
- hdu5889(最大流+最短路)
- maven项目中json-lib依赖无法使用
- Linux常用命令
- jstl配置 c.tld not found
- docker容器运行不退出的方法
- 数论-模板 (待更新)