针对数据库中的大数据,不希望特别早的加载到内存中,当使用到的时候在加载。 类懒加载:默认lazy=”true”只有用session.load()才能懒加载 集合懒加载:
针对一对多或者多对多的情况,加载set集合时决定在什么时候给集合填充数据。 当指定为懒加载时:只有使用到set集合时,他才会发出sql语句。
Spring:
1.IOC:控制反转”,不是什么技术,而是一种设计思想,在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。 依赖注入(DI):被注入对象依赖IoC容器配置依赖对象
所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。
所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。
控制的什么被反转了?就是:获得依赖对象的方式反转了。
依赖注入的三种配置方式: 1.通过set方式 2.通过构造函数
3通过注解(只能用于引用类型)
利用spring ioc和di 做到了完全面向接口编程。 比如:客户端做到完全面向接口编程。
2.Spring 容器加载过程:
1.spring容器关于ioc和di:启动过程----》 2.加载配置文件,启动spring容器--------》 3.spring容器会
* 如果有bean,则直接会为该bean创建对象
* 如果有类扫描的注解解析器,则会按照解析器的规则做 4.如果bean中有属性,则调用set方法(构造函数)给属性赋值 或者利用@Resource注解给属性赋值
5.创建对象之后,方法调用之前,会执行init方法,spring容器调用 6.在客户端调用方法
7.执行destroy方法,spring容器调用(针对单例) 8.关闭容器
3.注解:
必须依赖于类中的某个部分
Resourse(name=“user”) name Private User user;
name=“user”按照user 与容器中的进行匹配。不行报错
不写,则先按照user 匹配,不成功在按照类型匹配。再不行报错
4.动态代理:
AOP(面向切面编程)
通过代理模式:把日志,安全检查,权限重用了,做到了代码块的重用。面向切面编程。 代理对象的方法:就是拦截器invoke方法体的内容。 代理对象的方法把目标方法和切面整合在一起了。
Jdk代理:四个条件:目标接口目标类,拦截器,代理类 目标类和代理类实现了共同的接口
拦截器必须实现InvocationHandler接口,而接口中的invoke方法体的内容就是代理对象方法体的内容。
客户端调用代理对象的方法时,invoke方法执行。
代理对象和目标类实现了共同的接口,且代理类中有目标类的引用。
Cglib代理:
用CGlib生成代理类是目标类的子类。
用CGLib生成的代理类重写了父类的各个方法。
拦截器必须实现MethodInterceptor接口,而接口中的Interceptor方法体的内容
如果bean有代理对象,则返回代理对象,没有则返回原对象。 该目标类实现了接口则spring 容器会采用jdk代理,否则cglib
原理:
1.加载配置文件,启动spring容器。 2.spring容器为bean创建对象
3.解析AOP的配置解析切入点表达式。
4.看纳入spring管理的哪个类和切入点表达式匹配,如果匹配则创建代理对象。(拦截器由spring 内部实现)
5.代理对象的方法 = 目标方法 + 通知 6.客户端在context.getBean()时,该目标类实现了接口则spring 容器会采用jdk代理,否则cglib
切入点表达式 expression
确定哪个类可以生成代理对象 切入点表达式:
expression=\PersonDaoImpl类的所有方法。 代理:通过拦截器调用方法。。。。。(个人理解)
切面:日志,安全性的框架,权限的检查,总之与业务逻辑无关的都可以是切面。 通知:切面中的方法
Struts2 的启动流程; 1.启动tomcat 2.加载web.xml
3.过滤器:StrutsPrepareAndExecuteFilter
4.init()方法加载default.properties,struts-default.xml,struts-plugin.xml,struts.xml 5.静态注入配置文件中的 bean 当请求的url来时:
1. 调用StrutsPrepareAndExecuteFilter的doFilter()方法 2.把actionContext放入到ThreadLocal中 把ValueStack放入到ActionContext中 这样保证了值栈中的数据的安全性
3.创建action(因为是多例所以说现在才创建自己理解) 获取所有的interceptor 4. (也使用了动态代理) 执行所有的拦截器 执行action 中的方法 结果集的执行
Spring 声明式事务处理
Spring 事务架构:
接口与抽象类的差别,也可以体现出来。
接口platformTransactionManager
AbstractPlatformTransactionManager这个类对接口中的commit和rollback进行了实现,而getTransaction,因为不同的技术产生事务的方式不一样,所以这里有一个抽象方法 比如:你用hibernate(HibernateTransactionManage)或者jdbc(DataSourceTransactionManager)启动事务
具体到每一个实现类,自己根据自己特点实现getTransaction()这个方法
三大框架整合;
Struts.xml strut2 applicationContext.xml spring hibernate.cfg.xml hibernate
Spring + hibernate:
把sessionFactory注入到spring 中(并让hibernate 的事务由sessionFactory起。)
Spring+struts2:
1.容器启动时自动加载applicationContext.xml配置文件(配置ContextLoaderListener监听器)
spring容器是以监听器的形式整合到web服务器中的
因为service层和dao层的类在spring容器中都是单例模式配置,在spring容器启动的时候dao层和service层所有的类就创建对象了,包括service层代理对象在spring容器启动的时候,action层并没有创建对象,因为action对象是多例的,所以spring容器不负责销毁
2.让spring创建action
3.把struts的请求委托给spring管理:作用:创建Action实例的过程由spring处理
struts.xml
4.创建package并配置Action 框架各自流程: Hibernate: 加载配置文件(hibernate.cfg.xml *.hbm.xml) 产生sessionFactory 产生session 查询/启动事务 cud 关闭事务