您的位置:首页 > 编程语言 > Java开发

######Spring第5天ssh整合(注解版)难理解知识点:【自定义 方法加注解的方式】给dao注入sessionFactory属性+【搞清@Autowared和@Resource含义】

2017-10-11 20:38 901 查看
===【方法加注解的方式】给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再牛,也不能单凭一个属性名就能创建对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐