spring 4++学习笔记(3一 5.9)

来源:互联网 发布:淘宝樱木花道家鞋真吗 编辑:程序博客网 时间:2024/06/05 05:21

(1)JDBC JDBCTemplate Hibernate 的区别以及与jpa的关系:JDBCTemplate 封装了JDBC (没有实现jpa规范);JPA规范的核心是ORM,可以通过对象操作数据库,不必知道数据库有哪些表,可以省下大量的代码量。而Hibernate 实现了JPA。 相关链接:http://blog.csdn.net/haoliyanzhanghao/article/details/21016383
(2)持久层: 
 操作数据库的方式:1.spring 内置轻量级的jdbcTemplate (需spring-boot-stater-jdbc 启动器) 2.第三方持久化框架Hibernate / MyBaits (需spring-boot-stater-jpa 启动器) 
导入依赖包之后,为了让  SpringBoot能够自动装配数据源的连接,需要在资源根目录resource下创建一个application.properties,配置数据库的连接信息。

(3) 我们使用Spring的<context:component-scan>扫描指定类包下的所有类,这样在类中定义的Spring注解(如@Repository、@Autowired等)才能产生作用。 而Boot 会帮我们自动装配好。Boot的强大之处在于开发人员只需关注业务的实现,而无须关注Bean装配等配置,这也是Springboot设计的初衷。(只需在主类上使用@SpringBootApplication)

(4) 事务开启 :在主类上标注@EnableTransactionManagement 注解(开启事务支持,相当于XML的<tx:annotation-driven/>配置方式) 然后在Service方法上标注@Transaction注解即可;将标注注解在类上,则类下的所有方法都会开启事务。不建议在类上注解@Transaction。

(5)属性注入:

<bean  id="car" class="com.smart.Car">

<property name="brand"> <value>200</value></property>

</bean>

配置文件中<property  name="brand"/>的属性配置权仅要求Car类中拥有setBrand()方法,但Car类中不一定要拥有brand成员变量

属性注入指通过setXXX()方法注入Bean的属性值或依赖对象。使用属性注入时一定要有无参构造函数,否则会出错。(实际应用中最常用的注入方式)

注入字符常量时<property name="brand"> <value><![CDATA [字符常量的值] ]></value></property>  ,加了一个特殊的的xml标签<![CDATA [] ],让xml解析器将标签中的字符串当作普通的文本对待,以防止特殊字符串对XML格式造成破坏。

(6)一般情况下,无状态或者状态下不可变的类适合使用单例模式,不过spring对此实现了超越。在传统开发中,由于DAO类持有Connection这个非线程安全的变量,因此往往未采用单例模式。而在Spring环境下,对于所有的DAO类都可以采用单例模式,因为Spring利用AOP和我LocalThread功能,对非线程安全的变量进行了特殊处理,使这些非线程安全的类变成了线程安全的类。因为Spring的这一超越,所以在实际应用中,大部分Bean都能以单实例的方式运行,这也是为什么Spring将Bean的默认作用域定为singleton的原因。

(7)如果用户不希望在容器启动时提前实例化singleton的Bean,则可以通过 lazy-init 属性进行控制.

<bean id="boss1" class="com.smart.Boss" p:car-ref="car" lazy-init="true"/>

lazy-init="true"的Bean在某些情况下依然会提前实例化:如果该Bean被其他需要提前实例化的Bean所引用,那么Spring将会忽略延迟实例化的设置。

(8)当将WEb相关作用域的Bean注入singleton或prototype的Bean中,需要配置SpringAop。<bean name="car"  class="" scope="request"><aop:scope-proxy/></bean>      <bean id="boss"  class="" ><peoperty name="" ref="car"/></bean> (1)为了能够在配置文件中使用AOP的配置标签,需要在文档的声明头中定义Aop命名空间。(2)在配置文件中配置AOp后,注入BOSS bean中的car bean 已经不是原来的car bean 而是 car bean 的代理对象。这个动态代理是Car类的子类,spring在动态代理子类中加入一段逻辑,用以判断当前的boss需要取得那个HTTP请求相关的car bean。


(9)当调用getBean("car")时,spring 通过反射机制发现CarFactoryBean 实现了Factory的接口,这时Spring容器就调用接口方法CarFactoryBean#getObject()返回工厂类创建的对象。如果用户希望获取CarFactoryBean的实例,则需要在使用getBean(beanName)方法时显式地在beanName前加上“&”前缀,即getBean("&car");

当配置文件中<bean>的Class 属性配置的实现类是FactoryBean时,通过getBean()方法返回的不是FactoryBean本身,而是FactoryBean#getObject()方法所返回的对象,相当于Factory'Bean#getObject()代理了getBean();

后来补充:

一 bean的生命周期

1.Bean自身的方法:调用构造函数,setXXX方法以及<bean>的 inti-method 和destory-method所指定的方法。

2.Bean级生命周期接口方法:BeanNameAware,BeanFactoryAware,InitializingBean和DisposableBean,这些接口方法有Bean类实现。

3.容器级生命周期接口方法:InstantiationAwareBeanPostProcessor(extends)和BeanPostProcessor(implements)这俩个接口实现的,一般称他们的实现类为“后处理器”。

后处理器一般不由Bean实现,他们独立于Bean,实现类以容器附加装置的形式注册到Spring容器中,并通过接口放射为Spring容器扫描识别。当Spring容器创建任何Bean的时候,这些后处理器都会发生作用,所以这些后处理器的影响都是全局性的。当然,用户可以通过合理地编写后处理器,让其仅对感兴趣的Bean进行处理。

4.工厂后处理器接口方法:包括AspecjJWeaVingEnable,CustomAutowireConfigurer,ConfigurationClassPostProcessor等。工厂后处理器也是容器级的,在应用上下文装配配置文件后立即调用。


代码:
MyBeanPostProcessor implements BeanPostProcessor
MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter

控制台输出:

MyInstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation
调用Car()构造函数。
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
InstantiationAwareBeanPostProcessor.postProcessPropertyValues
调用setBrand()设置属性。
调用BeanNameAware.setBeanName()。
调用BeanFactoryAware.setBeanFactory()。
调用MyBeanPostProcessor.postProcessBeforeInitialization()
调用InitializingBean.afterPropertiesSet()。
调用myInit()
调用MyBeanPostProcessor.postProcessAfterInitialization()
调用DisposableBean.destory()。
调用myDestroy()。

原创粉丝点击