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()。
- spring 4++学习笔记(3一 5.9)
- spring 4++学习笔记(0一 2.5.3)
- Spring学习笔记(一)
- Spring 学习笔记(一)
- spring学习笔记(一)
- Spring学习笔记(一)
- Spring学习笔记(一)
- spring学习笔记(一)
- Spring 学习笔记(一)
- spring学习笔记(一)
- Spring 学习笔记(一)
- Spring学习笔记(一)
- Spring学习笔记(一)
- spring学习笔记(一)
- Spring学习笔记(一)
- spring学习笔记(一)
- Spring学习笔记(一)
- Spring 学习笔记(一)
- Android性能优化工具之Traceview
- 统一建模语言
- Java基础面试题整理
- Servlet中文乱码处理
- 【数据结构】特殊矩阵的压缩存储1——对称矩阵
- spring 4++学习笔记(3一 5.9)
- Gradle与Gradle插件版本适配和离线Gradle遇到的问题
- c#——Enum之Json序列化
- java 一维数组求最大数最小数
- 【数据结构】特殊矩阵的压缩存储2——稀疏矩阵
- java中的除法和取于注意点
- jupyter
- Oracle VM VirtualBox虚拟MS-DOS时失败,提示内存不能为“written”
- 解决orcale中nvarchar与varchar的数据类型转换问题