【Spring】-入门

注解汇总

@Service用于标注业务层组件,表示定义一个bean,自动根据bean的类名实例化一个首写字母为小写的bean
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

@Scope默认是"singleton"即单例
@prototype表示原型即每次都会new一个新的出来

AutoWire

@Autowired和@Resource两个注解的区别:
@Autowired默认按照byType方式进行bean匹配,
@Resource默认按照byName方式进行bean匹配
@Autowired是Spring的注解,
@Resource是J2EE的注解,
这个看一下导入注解的时候这两个注解的包名就一清二楚了
@Autowired 自动装配 可以省略get和set方法;
当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去
@Autowired接口注入
如果有一个接口,对应一个实现类,则可以正常装配;
如果有一个接口,有多个实现:
 @Autowired
 @Qualifier(“xxx”)
 注意@Qualifier注解括号里面的应当是接口实现类的类名
@Resource的装配顺序:
 @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
 指定了name或者type则根据指定的类型去匹配bean
指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

注入规则

把DAO实现类注入到service实现类中,
把service的接口(注意不要是service的实现类)注入到action中
@Autowired后不需要getter()和setter()方法,Spring也会自动注入。至于更具体的内容,等对注入的方式更

SpringMVC流程

Spring MVC的控制器是单例模式,线程不安全
在这里插入图片描述

  1. 用户发送请求至前端控制器DispatcherServlet。
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器。
  5. 执行处理器(Controller,也叫后端控制器)。
  6. Controller执行完成返回ModelAndView。
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
  9. ViewReslover解析后返回具体View。
  10. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
    DispatcherServlet响应用户

SpringMVC注解&驱动器

context:component-scan/ 扫描指定的包中的类上的注解,常用的注解有:
@Controller 声明Action组件 控制器的注解,
@Service 声明Service组件 @Service(“myMovieLister”)
@Repository 声明Dao组件
@Component 泛指组件, 当不好归类时.
@RequestMapping("/menu") 请求映射
@Resource 用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name=“beanName”)
@Autowired 用于注入,(srping提供的) 默认按类型装配
@Transactional( rollbackFor={Exception.class}) 事务管理
@ResponseBody
@Scope(“prototype”) 设定bean的作用域、
@RequestMapping
作用类上是父路径
作用于方法上处理器
建议不要舍弃类定义的RequestMapping
支持占位符风格定义
URL中的{xxx}占位符可以通过@PathVariable(“xxx”)绑定到操作的入参上
@RequestMapping有六个参数。分别是:
1.value
用于设置方法或者类的映射路径,可以直接写路径,即@RequestMapping("/Student");==@RequestMapping(value="/Student");
2.method
用于指定请求的方法,可以设置单个或多个,如果请求方法不满足条件则会请求失败。
3.params
这个参数比较特殊,他和后续讲到的@RequestParam的作用有点像,不过params是可以指定多个url携带的参数,而@RequestParam只可以对一个参数进行注解。
4.headers
headers这个参数,让人有种望文生义的感觉。看着这个单词就大概可以猜到,他是和请求头部有关,而事实上也确实是这样。用于指定请求的headers,必须要含有这个headers才可以请求。
前四个感觉还是很重要的,特别是前两个,但是最后两个就不清楚以后是否要用到。

5.consumes
用于指定处理何种请求的提交内容类型context-type,如果不是指定的类型,则不处理。提交的类型会在页面就有提示,比如说,一般的网页是text/html

  1. produces
    按道理来说这个也应该是要满足什么要求才进行处理,所以说这个应该是请求中accept含有produces中指定的内容类型才可以进行处理。例如
    produces=“application/json”
    意思就是,请求中accept含有application/json的内容类型才可以进行处理。
    这个完全不知道什么回事。暂且先这样留着。

SpringMVC和Spring父子容器

 Spring框架,容器是核心思想,用管理Bean的整个生命周期的;
 Spring中可以包括多个容器,容器有上下层关系
 最常是项目中引入Spring和SpringMVC这两个框架,它其实就是两个容器,
 Spring是父容器,SpringMVC是其子容器,
 在Spring父容器中注册的Bean对于SpringMVC容器中是可见的,
 而在SpringMVC容器中注册的Bean对于Spring父容器中是不可见的,
 就是子容器可以看见父容器中的注册的Bean,反之就不行

Spring和Springmvc和作为两个独立的容器,
会把扫描到的注解对象分别放到两个不同的容器中
Springmvc容器是spring容器的一部分,他们访问对象的范围如下所示:
①:springmvc子容器可以访问spring父容器中的对象
②:spring父容器不能访问springmvc子容器中的对象

在这里插入图片描述

IOC &&AOP

IoC(Inversion of Control)
(1). IoC(Inversion of Control)是指容器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控。控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。 对于Spring而言,就是由Spring来控制对象的生命周期和对象之间的关系;IoC还有另外一个名字——“依赖注入(Dependency Injection)”。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,即由容器动态地将某种依赖关系注入到组件之中。
(2). 在Spring的工作方式中,所有的类都会在spring容器中登记,告诉spring这是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
(3). 在系统运行中,动态的向某个对象提供它所需要的其他对象。
(4). 依赖注入的思想是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。 总而言之,在传统的对象创建方式中,通常由调用者来创建被调用者的实例,而在Spring中创建被调用者的工作由Spring来完成,然后注入调用者,即所谓的依赖注入or控制反转。 注入方式有两种:依赖注入和设置注入; IoC的优点:降低了组件之间的耦合,降低了业务对象之间替换的复杂性,使之能够灵活的管理对象。
AOP(Aspect Oriented Programming)
(1). AOP面向方面编程基于IoC,是对OOP的有益补充;
(2). AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了 多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的 逻辑或责任封装起来,比如日志记录,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
(3). AOP代表的是一个横向的关 系,将“对象”比作一个空心的圆柱体,其中封装的是对象的属性和行为;则面向方面编程的方法,就是将这个圆柱体以切面形式剖开,选择性的提供业务逻辑。而 剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹,但完成了效果。
(4). 实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
(5). Spring实现AOP:JDK动态代理和CGLIB代理 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理;其核心的两个类是InvocationHandler和Proxy。 CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强;需要引入包asm.jar和cglib.jar。 使用AspectJ注入式切面和@AspectJ注解驱动的切面实际上底层也是通过动态代理实现的。
(6). AOP使用场景:
Authentication 权限检查
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 延迟加载
Debugging  调试
logging, tracing, profiling and monitoring 日志记录,跟踪,优化,校准
Performance optimization 性能优化,效率检查
Persistence  持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务管理
另外Filter的实现和struts2的拦截器的实现都是AOP思想的体现。

$ 和

${key名称}
1.用户获取外部文件(properties)中指定key的值;配置文件数据
2.可以在xml中配置,也可以出现在@value注解中
3.一般用于获取数据库配置内容信息
#{表达式}
1.spring中el表达式的格式
2.可以在xml中配置,也可以出现在@value注解中
3.可以任意表达式,支持运算符
4.一般用于数据库sql语句的获取字段信息,可以防止sql注入

发布了58 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/dong8633950/article/details/100180947