reflect-spring-springmvc知识点回顾

**1、反射
获取到Class对象的三种方式:
Class.forName(“全限定名”)
类名.class
obj.getClass()

Class对象,加载类之后,JVM创建的,在堆内存中只有一份

对Class对象有很多操作,可以获取到类的几乎所有的结构信息

类的所有属性		Field	getDeclaredFields()
父类的非私有属性	Field	getFields()
类的所有方法		Method	getDeclaredMethods()
父类中的非私有方法	Method	getMethods()
获取到类的构造方法	Constructor	getConstructor()

动态创建对象(实例)
class对象.newInstance(),会调用类的无参构造方法

2、spring
spring就是管理bean的。
spring会根据它的主配置文件,帮我们创建对象,并且组装对象,完成对象间的互相依赖。
这就是spring的IOC和DI。因为在spring之前,我们都是程序员根据需要来new对象的,这样
的代码耦合性很高,不易维护和扩展,有了spring之后,对象就不需要我们new了,而是spring
代替我们来创建,并且会维护对象间的依赖。这就是控制反转和依赖注入。
spring创建的对象默认是单例的,我也可以指定对象的scope属性配置成prototype也就是原型的。
这里应用到了单例设计模式,单例设计模式分为懒汉式和饿汉式,在这我就不详细介绍了。
依赖注入也有很多种,我们有属性注入,构造器注入,而且注入类型也很多,List,Map,Array,
Properties这些复杂类型都可以注入。
spring就像是我们的大管家一样。
spring还可以进行面向切面编程,也就是AOP。
AOP可以用来进行业务功能的增强。比如说,你想在所有的业务前后开关事务,可以用AOP解决,
比如说,你想在所有的方法进行性能统计(统计方法执行的时间),也可以用AOP解决。再比如说,
你想在所有的方法执行前都记录一条日志,也可以用AOP解决。
AOP其实就是动态代理的一种实现,这就牵扯到了代理设计模式。
我们都知道代理分类静态代理和动态代理。静态代理可以对原有对象进行功能的增强。但是静态
代理有个致命的缺点,就是一个代理类只能代理一个目标对象,假如现在有N个目标对象,就需要
创建N个代理类,导致类爆炸。动态代理就解决了静态代理的致命问题,一个代理类,可以代理所
有的目标对象。动态代理又分为两种,一种是JDK提供的代理,这种代理是面向接口的,一种是cglib
实现的动态代理,这种是面向类的。
JDK的动态代理,代理对象和目标对象都要实现相同的接口,代理对象内部要持有一个目标对象的引用。
cglib的动态代理 ,代理对象是目标对象的子类,它俩有继承关系。
spring默认使用的JDK的动态代理,因为推荐我们在编程的时候面向接口编程,扩展性和解耦性更好。
如果目标对象没有实现接口,比如说我们的controller层想要加上AOP的功能,那么就得用cglib的动态
代理了,因为controller层没有实现接口。需要导入cglib的jar包,然后在spring配置文件中指定
target-proxy-class = “true” 这个配置,然后就会启用cglib的动态代理。
在spring中aop的应用主要体现在声明式事务上:声明式事务的配置:
首先有pointcut切点配置,就是指很多个目标方法,一般都位于service层。
其次要配置通知advice,通知就是来指定在方法的前面增加什么功能,方法的后面增加什么功能。
最后要引用事务管理器transactionManager,通知需要增加的功能都在事务管理器中写好了。
spring配置文件中有哪些标签或配置:
我以前做项目,spring主配置文件里主要配置的内容有:
扫描包,主要扫描的有service层,dao层,扫描的这些包的类上要加上@Controller,@Service,
@Repository,@Component注解,当扫描到这些注解时。spring就会帮我们创建些对象并管理起来。
创建的对象在容器中的id默认是类名的小驼峰形式。
还会配置对属性文件的加载,用到的是cotext:property-placeholder-scan ,这样的话,在spring
中就可以使用el表达式的方式来引用属性文件中的key获取它的值了。
还会配置数据源,数据源也是一个bean,我用过dbcp,c3p0,druid等等数据源,数据源会在容器加载时
初始创建一些连接,然后放入连接池中,每一个请求过来都不会再重新创建连接和释放连接了,因为
创建连接和释放连接时一个耗时的操作,而是直接从连接池中取连接,用完再放回连接池。并且连接
不够用的时候连接池还会创建新的连接出来,起到缓冲的作用。
还有事务的配置,aop的配置,advice的配置,transactionManager事务管理器的配置。
sessionFactory,或者sqlSessionFactory的配置,这些就是hibernate框架或者mybatis框架进行CRUD
的主要的API。
对于mybatis来说,还要配置对Mapper接口的扫描器。
大概就这么多配置。
3、SSH整合
1、搭建Struts2框架,测试页面跳转成功,表明struts框架OK
2、整合spring框架,特别需要注意的是需要添加struts和spring的一个插件包。把struts.xml中的action配置
由以前的全限定名,改为spring容器中管理的bean的id。然后测试访问项目正常运行,则整合完成。
3、整合hibernate框架,需要在spring中配置数据源,还有hibernate的一些属性配置,比如方言,展示sql,等
等,还有对hibernate映射文件的扫描,都交给spring管理,这样的话就把hibernate.cfg.xml主配置文件去掉了。
还要配置sessionFactory,注入上面配好的数据源。
再配置hibernateTemplate,注入sessionFactory。
再配置声明式事务,交由spring来在service方法前后开关回滚事务。
4、springMVC
springMVC是一个控制层框架,它用来代替struts2框架的。
springMVC开发速度更快,因为struts2框架需要不断的编辑struts.xml,而springMVC框架只需要配置一遍
主配置文件,剩下的就是开发Controller层,请求的映射都是通过注解来配置的,不需要编辑配置文件。
springMVC的运行速度也比Struts2要快,因为struts2是多例的,每一个请求都会创建一个新的Action实例,
还会创建一个值栈来为本次请求服务,而springMVC是单例的,一个controller实例就可以为所有的请求提供
服务。它是用方法来接参的,不会定义成员变量,因为会产生并发冲突。
springMVC呢,首先用户的请求会请求到web.xml中的核心控制器DispatcherServlet,核心控制器会寻找
HandlerMapping来查看该请求是否能映射到controller的某个方法上,如果能映射上,就会创建一个
HandlerAdapter适配器,来调用指定的Handler处理器,也就是我们的controller,执行相关的方法,返回
一个ModelAndView模型视图对象,这个对象会经过视图解析器,根据逻辑视图,来寻找到具体的视图,然后
再把模型中的数据渲染到具体的视图页面,把渲染后的html页面响应给用户。至此完成一个请求。
但是我们在使用springMVC的时候,在主配置文件中通常都不会配置handlerMapping和handlerAdapter。
配置的主要内容有:
1、扫描包,扫描controller层
2、context:annotation-driven注解驱动,配置注解驱动就会默认应用指定的handlerMapping和
handlerAdapter
3、视图解析器,我们用的一般是jsp做视图,所以使用InternalResourceViewResolver,会配置
prefix和suffix用来在逻辑视图的前面和后面进行拼接。
4、在做上传文件时会加入MultipartResolver上传文件的解析器。
springMVC天生和spring就是集成到一起的,所以在整合时不需要任何插件包。
目前为止,我做的项目和我的朋友们公司大多都用springMVC,用struts2的已经很少了。
哦对了,springMVC还可以很好的支持restful风格,简单说就是一种动词变名词的uri的接口定义方式。
springMVC主要用到的注解有@RequestMapping,@ResponseBody,@PathVaraible,@ModelAttribute,
@SessionAttribute,等等注解。

如果核心控制器使用/过滤,会过滤所有的请求。
解决静态资源的问题:<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/bootstrap/**" location="/bootstrap/"/>

拦截器:
	HandlerMethodInterceptor
		preHandle
		postHandle
	<interceptos:>

5、springMVC+spring+hibernate整合
1、先搭建springMVC框架,测试OK
2、由spring管理service层和dao层,注入到controller层,如果注入成功,整合完成
3、整合hibernate,方式和ssh是一样的。
6、mybatis
mybatis是一个持久层框架,封装了JDBC。
mybatis也有主配置文件:数据源,别名,映射文件
映射文件:手写sql,

使用方式:1、加载主配置文件,生成sqlSessionFactory
2、创建sqlSession,sqlSession(true)
3、直接调用映射文件中的id,传一个Object类型的参数
使用面向接口:接口 接口实例=sqlSession.getMapper(接口.class)

		传入参数:parameterType,parameterMap
		返回结果:resultType,resultMap
		
在sql中抓参:${name} Statement,sql注入的问题
			 #{name} PreparedStatement,使用的是?占位符。
resultMap:它就是节省了我们95%代码的那个东西。
		一对多:<collection>
		多对一:<associate>
动态SQL:<if><where><set><foreach>
mybatis反向生成工具,根据表->实体类,映射文件,mapper层

7、ssm整合:
springmvc+spring整合
整合mybatis时,去除mybatis主配置文件,把mybatis主配置文件中的配置,
全都移到了spring配置文件中。
mybatis spring
数据库连接信息 数据源
别名 别名扫描包
映射文件 扫描映射文件的目录
面向接口编程 映射器扫描类(需要用到sqlSessionFactory,帮我们创建Mapper接口的映射器类)

sqlSessionFactoryBean,依赖到数据源

**

猜你喜欢

转载自blog.csdn.net/qq_43049310/article/details/84875954