spring
2020-12-20 21:25:17 0 举报
AI智能生成
spring笔记
作者其他创作
大纲/内容
源码
IOC
BeanFactory(IOC容器)
通过反射技术来实例化对象并维护对象之间的依赖关系
beans.xml
定义需要实例化对象的类的全限定类名以及类之间依赖关系的描述
IOC实现
纯xml(bean信息定义全部配置在xml中)
xml+注解 部分bean使用xml定义,部分bean使用注解定义
纯注解模式,所有的bean都是用注解来定义
JavaSe应用: ApplicationContext applcationContext =new AnnotationConfigApplicationContext(SpringConfig.class)
JavaWeb应用:ContextLoaderListener(监听器去加载注解配置类)
JavaWeb应用:ContextLoaderListener(监听器去加载注解配置类)
实例化方式
<!-- Spring ioc 实例化Bean的三种方式-->
<!-- 方式一:使用无参构造器(推荐)-->
<bean id="connectionUtils" class="cn.cht.utils.ConnectionUtils"></bean>
<!-- 方式一:使用无参构造器(推荐)-->
<bean id="connectionUtils" class="cn.cht.utils.ConnectionUtils"></bean>
<!--另外两种方式是为了我们自己new 的对象加入到SpringIoc容器管理-->
<!-- 方式二:静态方法-->
<bean id="connectionUtils" class="cn.cht.factory.CreateBeanFactory" factory-method="getInstanceStatic"></bean>
<!-- 方式二:静态方法-->
<bean id="connectionUtils" class="cn.cht.factory.CreateBeanFactory" factory-method="getInstanceStatic"></bean>
<!--方式三:实例化方法-->
<bean id="createBeanFactory" class="cn.cht.factory.CreateBeanFactory"></bean>
<bean id="connectionUtils" factory-bean="createBeanFactory" factory-method="getInstance"></bean>
<bean id="createBeanFactory" class="cn.cht.factory.CreateBeanFactory"></bean>
<bean id="connectionUtils" factory-bean="createBeanFactory" factory-method="getInstance"></bean>
scope bean的作业范围
singleton
单例,IOC容器中只有一个该类对象
prototype
原型(多例),每次使用该类的对象(getbean)都返回给一个新的对象
bean的注入
set注入
<property >如果注入的是另一个bean对象那么使用ref属性,如果注入的是普通值,那么使用value属性
构造注入
<constructor-arg>可以使用index索引位置注入,也可以使用name参数注入
注解
Resource按照ByName进行注入
javaEE的
Autowiried按照类型注入
Spring的
分支主题
手写Ioc和Aop
问题分析
问题一: new 关键字将Service层的实现类ServiceImpl和Dao层的具体实现类DaoImpl耦合在一起,当需要切换Dao层实现类时候, 必须修改service层代码,否则就不符合面向接口开发的最优原则
问题二:service层没有添加事务控制,出现异常可能会导致数据错乱,问题严重,尤其是在金融行业
分析问题二
分析总结: 数据库事务归根结底是Connection的事务 connection.commit() 提交事务 connection.rollback()回滚事务
分析1) 两次update 使用了两个数据库连接Connection,这样的话,肯定是不属于一个事务控制了
分析2) 事务控制目前在dao层进行,没有在service层
解决方案:
解决问题一
new 关键字在实例化对象,除了new以外,还可以通过反射(Class.foName("全限定类名"); 可以把全限定类名配置在xm中)
使用工厂来通过反射技术生产对象,工厂模式是解耦合非常好的一种方式
解决问题二
让两次update使用同一个connection连接
两次update属于同一个线程内执行调用,我们可以给当前线程绑定一个Conncetion,和当前线程有关系的数据库操作都去使用这个Conncetion(从当前线程中去拿)
把事务控制添加在service层
学习注解技巧:找xml中标签和注解一一对应关系即可
启动方式:1. JavaSE应用 ApplicationContext applicationConxt=new ClassPathXmlApplicationContext("beans.xml")
或者 new FileSystemXmlApplicationContext("c://beans.xml")
启动方式2: ContextLoaderListener(监听器去加载xml)
或者 new FileSystemXmlApplicationContext("c://beans.xml")
启动方式2: ContextLoaderListener(监听器去加载xml)
0 条评论
下一页