一、Spring

  • 什么是bean?
    Bean :在计算机英语中,有可重用组件的含义

  • 什么是JavaBean?
    JavaBean : 用java语言编写的可重用组件

  • 什么是可重用组件?
    这里我们拿Spring来举例,众所周知使用Spring,我们就会用到Spring容器。容器起到的作用就是减少我们创建对象的次数,也就是每次用对象,直接取的容器当中的。
    实际应用:
    一般我们会在控制层加@Controller注解,这个就是把该类存放到容器当中,然后当我们想要从容器当中获取的时候,可以写一个变量类型和变量名称再加上@Autowired,这也是依赖注入,他会去容器当中找对应的实例,然后注入到该变量中,然后我们就可以直接使用该对象了。最终达到了代码重用的效果。

什么是Spring?

spring是J2EE应用程序框架,是轻量级的IoC(控制反转)和AOP(面向切面)的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。

最大目的:简化开发。

spring采取的关键策略:

  • 基于POJO的轻量级和最小侵入性编程;
  • 通过依赖注入和面向接口实现松耦合;
  • 基于切面和惯例进行声明式编程;
  • 通过切面和模板减少样板式代码。

1、spring框架的最小侵入性

Spring竭力避免因自身的API而弄乱你的应用代码。 Spring不会强迫你实现Spring规范的接口或继承Spring规范的类, 相反, 在基于Spring构建的应用中, 它的类通常没有任何痕迹表明你使用了Spring。只能通过xml配置文件来看出spring的思想。

不侵入如何实现spring框架强大的功能,spring框架不是很强大吗?在这里我要说明,spring框架是很强大,但它的强大在于它的理念,它的思想,而不是它实现了多强大的功能。

当然不侵入有不侵入的解决方法,在我的理解里它的解决方法也算是spring的核心吧!那就是配置文件或者注解。

2、通过依赖注入和面向接口实现松耦合

理解Spring IOC概念及如何降低代码耦合度

3、应用切面

能够让相互协作的软件组件保持松散耦合, 而面向切面编程允许你把遍布应用各处的功能分离出来形成可重用的组件。

面向切面编程往往被定义为促使软件系统实现关注点的分离一项技术。 系统由许多不同的组件组成, 每一个组件各负责一块特定功能。 除了实现自身核心的功能之外, 这些组件还经常承担着额外的职责。 诸如日志、 事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去, 这些系统服务通常被称为横切关注点, 因为它们会跨越系统的多个组件。

4、使用模板消除样板式代码

IoC(控制反转)

那么控制什么的的权利被反转了呢,我们知道在写代码的过程中,经常会出现两个对象之间出现依赖关系,当A对象依赖B对象时,我们通常在A对象中通过new的方式来创建它的依赖对象B,而控制反转之后,对于对象的创建权被托付给IOC容器了,也就是这些对象由容器来产生,而不是对象在需要的时候再去创建自己的依赖对象。

举例来理解IOC,一个家庭的组建需要夫妻两个,某种意义上,我们可以说两者之间存在依赖关系。传统方式就是,当我需要组建一个家庭时,我自己去找对象,自己去组建家庭,而IOC方式就是将找对象的权利委托给爸爸妈妈,当我一出生时,爸爸妈妈就为我指腹为婚,为我找好了对象。

AOP(面向切面)

能够让相互协作的软件组件保持松散耦合, 而面向切面编程允许你把遍布应用各处的功能分离出来形成可重用的组件。

面向切面编程往往被定义为促使软件系统实现关注点的分离一项技术。 系统由许多不同的组件组成, 每一个组件各负责一块特定功能。 除了实现自身核心的功能之外, 这些组件还经常承担着额外的职责。 诸如日志、 事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去, 这些系统服务通常被称为横切关注点, 因为它们会跨越系统的多个组件。


在类上面添加的注解

@Component

泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注把普通pojo实例化到spring容器中,相当于xml配置文件中的<bean id="" class=""/>

@Service

用于在业务逻辑层(BaseService.java)组件上添加的注解,想要获取此实例默认通过类名小写,还可以自己可定义,比如:@Service(“BaseService”’)

@Controller

用于在控制层(BaseController.java)组件上添加的注解

@Repository

用于Dao层实现组件,即Dao层的实现类上面添加的注解

@RequestMapping

处理映射请求的注解。用于类上,也可以用在方法上,加在类上表示类中的所有响应请求的方法都是以该地址作为父路径。有6个属性

1、value:指定请求的实际地址

A) 可以指定为普通的具体值;如@RequestMapping(value ="/testValid")B)  可以指定为含有某变量的一类值;如@RequestMapping(value="/test/{day}")C)  可以指定为含正则表达式的一类值;如@RequestMapping(value="/{textualPart:[a-z-]+}.{numericPart:[\\d]+}")  可以匹配../liminbo.122912请求。

2、method:指定请求的method类型, GET、POST、PUT、DELETE等

@RequestMapping(value = "/test", method = RequestMethod.GET, headers="Host=www.baidu.com")

3、consumes: 指定处理请求的提交内容类型(Content-Type)

@RequestMapping(value = "/test",consumes="application/json")处理application/json内容类型

4、produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

@RequestMapping(value = "/test", produces = "application/xml");
@RequestMapping(value = "/test", produces = "application/json");

5、params:指定request中必须包含某些参数值是,才让该方法处理

@RequestMapping(value = "/test", params="name=zhangsan")

6、headers:指定request中必须包含某些指定的header值,才能让该方法处理请求

@RequestMapping(value = "/test", method = RequestMethod.GET, headers="Host=www.baidu.com")

@ResponseStatus

用于修饰一个类或者一个方法,修饰一个类的时候,一般修饰的是一个异常类,当处理器的方法被调用时,@ResponseStatus指定的code和reason会被返回给前端。value属性是http状态码,比如404,500等。reason是错误信息。

@ResponseStatus(value=HttpStatus.FORBIDDEN, reason="出现了错误")
public class UserException extends RuntimeException{XXX
};

@Scope

在使用XML定义Bean时,我们可能还需要通过bean的scope属性来定义一个Bean的作用范围,我们同样可以通过@Scope注解来完成这项工作

//java中
@Scope("prototype")
public class Basic TypeController//xml中
<bean id = "" class = "" scope = "prototype"></bean>

1、singleton:单例,即容器里只有一个实例对象。

2、prototype:多对象

每一次请求都会产生一个新的bean实例,Spring不无法对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,由程序员负责销毁该对象,不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用

3、request:对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效

4、Session:作用于一次会话,一次会话内有效


在方法上面添加的注解

@RequestMapping 映射请求

@ResponseBody将方法返回的数据转换成json格式并响应给客户端.

@Transactional

用于该注解的方法会被spring aop加入事务管理,即该方法中如果出现异常呢么方法中进行的数据操作全部回滚。
注:使用该注解首先要在 xml 配置中的事务配置信息:

<bean id="transactionManager" class=
"org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" />
</bean>

在参数上面添加的注解

@RequestBody

将客户端发送的json格式数据和java对象、基本数据、数组集合等进行绑定,只接收post请求中的数据

@RequestParam

作用是提取和解析请求中的参数。支持类型转换,类型转换目前支持所有的基本Java类型
@RequestParam(value=”number ”) String number
将请求中参数为number映射到方法的number上。required=false表示该参数不是必需的,请求上可带可不带。

public Map<String,Object> Dome1(@RequestParam(value="id",defaultvalue="0",required=false)int id,@RequestParam(value="name",defaultvalue="0",required=false)int name
)

@PathVariable

处理请求 url部分,当使用@RequestMapping 样式映射时,即@RequestMapping(“test/{paramId}”), 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上

//根据ID删除客户
@RequestMapping("/delete/{id}")
@ResponseBody
public Map<String,Object> deleteById(@PathVariable(value="id")int id){}

@CookieValue

将cookie里一些值绑定到方法参数上

public Map<String,Object> deleteById(@CookieValue("JSESSIONID")String cookie){}

在属性上面添加的注解

@Autowired

自动注入,将用此注解的属性注入到当前类中,Autowired默认先按byType,如果发现找到多个bean,则,又按照byName方式比对,如果还有多个,则报出异常。

@Resource

默认按 byName自动注入,如果找不到再按byType找bean,如果还是找不到则抛异常,无论按byName还是byType如果找到多个,则抛异常。可以手动指定bean,它有2个属性分别是name和type,使用name属性,则使用byName的自动注入,而使用type属性时则使用byType自动注入。
@Resource(name=”bean名字”)
@Resource(type=”bean的class”)

@Qualifier

使用@Autowired 时,如果找到多个同一类型的bean,则会抛异常,此时可以使用 @Qualifier(“beanName”),明确指定bean的名称进行注入,此时与 @Resource指定name属性作用相同。

@Value

为了简化从properties里取配置,可以使用@Value, 可以properties文件中的配置值。

public class cat{@Value("${cat.ear}")private String ear;
}

@DateTimeFormat

可以将页面传过来的 String类型转换为 Date 类型。具体使用:直接在成员变量上加入注解就可以了,同时还可以指定 format 的格式.

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date creatDate ;

总结:

使用注解之前要开启自动扫描功能,其中base-package为需要扫描的包(含子包)。
<context:component-scan base-package="cn.test"/>
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。

@Scope注解 作用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
@Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
@PostConstruct 初始化注解
@PreDestroy 摧毁注解 默认 单例 启动就加载
@Async异步方法调用

参考博客:

什么是spring框架?spring框架到底有什么用?spring框架到底做了些什么?

Spring(注解)详解相关推荐

  1. spring注解详解与用法(总览)

    这篇文章收集了我写的所有的spring注解的详细说明与用法,点击可以跳转到对应文章,此文章会不断更新 spring注解详解与用法(1)最基础也是最常见的如下所示,详情点击这里 @Controller/ ...

  2. spring注解详解与用法(3)切面环绕

    导航:更多的spring注解标签点击这里 声明了切面类我们还需要定义切面的内容面向切面编程是spring的一个重要思想,也是精华之一 @Aspect 这是一个切面的注解,声明是一个额外的面向切面的功能 ...

  3. Spring注解详解

    概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...

  4. Spring实现自动装配(spring注解详解)和手动注入比较

    概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...

  5. Spring 注解详解

    使用注解来构造IoC容器 在spring 3.0中,通过@controller标注即可将class定义为一个controller类.为使spring能找到定义为controller的bean,需要在a ...

  6. Spring注解详解:@ComponentScan自动扫描组件使用

    目录 无注解方式component-scan使用 注解方式@ComponentScan使用 @ComponentScan的扫描规则 无注解方式component-scan使用 之前,我们需要扫描工程下 ...

  7. Spring注解详解包扫描bean注册

    一. @Configuration 配置 ​ 告诉Spring容器这是一个配置类 ==xml配置 二. @ComponentScan 包扫描 ​ 说明: //value:指定要扫描的包 //按照规则指 ...

  8. @Configuration Spring注解详解

    第一个作用 使用注释类@Configuration表示它的主要目的是作为bean定义的来源 第二个作用 @Configuration类允许通过简单地调用@Bean同一类中的其他方法来定义bean间依赖 ...

  9. spring注解详解,看完你就都全懂了!!

    转载:https://blog.csdn.net/walkerjong/article/details/7946109

  10. Spring零配置之@Configuration注解详解

    转载自 Spring零配置之@Configuration注解详解 @Configuration介绍 Spring3.0之前要使用Spring必须要有一个xml配置文件,这也是Spring的核心文件,而 ...

最新文章

  1. asp.net FileUpload随想随记
  2. .NET Compact Framework s60v3(在S60上运行Windows Mobile程序)
  3. vue 实现的评分小星星组件,包括半星
  4. C#设计模式--模板方法模式(学习Learning hard 设计模式笔记)
  5. 构建Windows Server 2008虚拟实验室
  6. php守护进程热更新,服务器编程--守护进程
  7. linux java -xms_为什么JVM比指定的-Xms消耗更少的内存?
  8. SpringBoot之SpringMVC自动配置
  9. 3d模型多怎么优化_3D打印人像模型是怎么制作出来的呢?
  10. L1-017. 到底有多二-PAT团体程序设计天梯赛GPLT
  11. gg修改器修改数值没有用怎么办_GG修改器详细使用教程
  12. 工作效率低如何解决?
  13. nginx证书绑定及二级域名反向代理
  14. Mac 消除系统更新小红点
  15. CC00027.elasticsearch——|HadoopElasticSearch.V27|——|ELK.v27|集群|QueryDSL|高亮|
  16. HTML中placeholder用法
  17. firefox Chrome浏览器redux devTools调试工具
  18. 工信部首次发声:培育一批进军元宇宙等新兴领域的创新型中小企业
  19. vb计算机 小数前没有0,VB 小于1的小数 显示不出来小数点前的0 大哥帮忙
  20. 关于梦想是计算机的作文英语,关于我的梦想英语作文(精选11篇)

热门文章

  1. 踩坑记录 PIL与Opencv读取图像的差别
  2. Core Data 教程(2): 如何预载/导入已有的数据
  3. Babylonjs PointerEventTypes.POINTERMOVE 获取不到模型信息
  4. Macbook上Gitlab下载代码
  5. 2021年起重机司机(限桥式起重机)多少分及格及起重机司机(限桥式起重机)考试内容
  6. matlab求马尔可夫转移矩阵,求马尔科夫模型的转移矩阵_马尔科夫转移矩阵
  7. P1_M4_L4 Longitudinal Vehicle Model(车辆纵向动力学建模)
  8. 计算机网络课程设计 文华学院,计算机网络课程设计-校园网的组建与设计.doc
  9. Android adb wifi无线调试 USB和无线串口设置连接 无线adb
  10. 计算机原理标准码,计算机原理试题附标准答案