一:前言

Spring是我们学习Java不可避开的一个重要的框架知识点,而在spring中核心知识点就是IOC和AOP,而其主的IOC控制反转就是将Bean初始化加载到容器中,但是Bean又是如何加载到容器中的呢,这里我们可以使用spring的注解方式或者通过spring XML配置的方式来进行实现。

Spring注解方式减少了配置文件内容,更加便于我们对于项目的管理,并且使用注解可以大大的提高我们的开发效率!

下面我们介绍一下spring中常用的一些注解。

二:组件类注解

@component:标注一个普通的spring Bean类。@Repository:标注一个Dao组件类。@service:标注一个业务逻辑组件类。@Controller:标注一个控制器组件类。这些都是注解在平时的开发中使用比较高的一些注解。这些注解实质上属于同一类注解,用法相同,功能相同,区别在于标识的组件类型不同。@component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。代码如下

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller{string  value()  default “”;}

②:举例详解

  • 当一个组件代表数据访问层(Dao)的时候,我们使用@Repository进行注解,如下
@Repository
public class HappyDaoImpl implements HappyDao{
private final static Logger LOGGER = LoggerFactory.getLogger(HappyDaoImpl .class);
public void  club(){//do something ,like drinking and singing}
}
  • 当一个组件代表业务层时,我们使用@Service进行注解,如下
@Service(value="goodClubService")
//使用@Service注解不加value ,默认名称是clubService
public class ClubServiceImpl implements ClubService {@Autowiredprivate ClubDao clubDao;public void doHappy(){//do some Happy}}
  • 当一个组件作为前端交互的控制层,使用@Controller进行注解,如下
@Controller
public class HappyController {@Autowired //下面进行讲解private ClubService clubService;// Control the people entering the Club// do something
}
/*Controller相关的注解下面进行详细讲解,这里简单引入@Controller*/

③:总结

备注解的java类当做Bean实例,Bean实例的名称默认是Bean类的首写小字母,其他部分不变。@Service也可以自定义Bean名称,但是必须是唯一的:2,尽量使用对应组件注解的类替换@Component注解,在spring未来的版本中,@Controller,@Service,@Resposity会携带更多语义。并且便于开发和维护!3,指定了某些类可以作为spring Bean类使用后,最好还需要让spring搜索指定路径,在spring配置文件中加入如下配置:

<!-- 自动扫描指定包及其子包下的所有Bean类 -->
<context:component-scan base-package="org.springframework.*"/>

三:装配bean时常用的注解

①:注解介绍

@Autowired:属于spring的org.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值@Resource:不属于spring的注解,而是来自于JSR-250位于java.annotation包下,使用该annotation为目标bean指定协作者Bean。@postConstruct和@preDestory方法实现初始化和销毁bean之前进行的操作。

②:举例说明

@Autowired

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD,
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {boolean required() default true;
}
@Controller
public class HappyController {@Autowired //默认依赖的ClubDao 对象(Bean)必须存在//@Autowired(required = false) 改变默认方式@Qualifier("goodClubService")private ClubService clubService;// Control the people entering the Club// do something
}
  • @Resource
@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {String name() default "";Class type() default java.lang.Object.class;
public class AnotationExp {@Resource(name = "HappyClient")private HappyClient happyClient;@Resource(type = HappyPlayAno .class)private HappyPlayAno happyPlayAno;
}

③:总结

  • 相同点:@Resource的作用相当于@Autowired,均可以标注在字段或属性的setter方法上。

  • 不同点:提供方@Autowired是spring的注解,@Resource是javax.annotation注解,而是来自于JSR-250,J2EE提供,需要JDK1.6以上。

  • 注入方式@Autowired只按照Type注入;@Resource默认按Name自动注入,也提供按照Type注入

  • 属性:@Autowired注解可用于为类的属性、构造器、方法进行注值。默认情况下,器依赖的对象必须存在(bean可用),如果需要改变这种默认方式,可用设置其required属性为false。还有一个比较重要的点就是,@Autowired注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法时结合**@Qualifier**注解进行限定,指定注入的bean名称。

  • @Resource有两个重要的属性,name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认读取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。需要注意的是,@Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。

  • @Resource注解的使用性更为灵活,可指定名称,也可以指定类型;@Autowired注解进行装配容易抛出异常,特别是装配的bean类型有多个的时候,而注解的办法时需要增加@Qualifer进行限定。

               [Spring中 @Autowired注解与@Resource注解的区别](http://qiangmzsx.blog.51cto.com/2052549/1359952)
    

注意点:使用@Resource也要注意添加配置文件到spring,如果没有配置component-scan

<context:component-scan>
<!--<context:component-scan>的使用,是默认激活<context:annotation-config>功能-->

则一定要配置annotation-config

<context:annotation-config/>

四:@Component vs @Configuration and @Bean

①:简单介绍

spring的官方团队说@Component可以替代@Configure注解,事实上我们看源码也可以发现看到,如下

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component  //看这里!!!
public @interface Configuration {String value() default "";

虽然说可以替代但是两个注解之间还是有区别的!
Bean注解只要用于方法上,有点类似于工厂干活,当使用@Bean注解,我们可以连续使用多种定义bean是用到的注解,譬如用@Qualifier注解定义工厂方法的名称,用@Scope注解定义该bean的作用域范围,譬如是singleton还是prototype等。

spring中新的Java配置支持的核心就是@Configuration注解的类。这些类主要包括@Bean注解的方法来为spring的IOC容器管理的对象定义实例,配置和初始化逻辑

使用@Configuration来注解类表示可以被spring的IOC容器所使用,作为bean定义的资源。

@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}
}

这和spring的xml文件中的非常类似

<beans><bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>

@Bean注解扮演了和元素相同的角色。
②:举例说明@Component和@Configuration

@Configuration
public static class Config {@Beanpublic SimpleBean simpleBean() {return new SimpleBean();}@Beanpublic SimpleBeanConsumer simpleBeanConsumer() {return new SimpleBeanConsumer(simpleBean());}
}
@Component
public static class Config {@Beanpublic SimpleBean simpleBean() {return new SimpleBean();}@Beanpublic SimpleBeanConsumer simpleBeanConsumer() {return new SimpleBeanConsumer(simpleBean());}
}

第一个代码正常工作,正如预期的那样,SimpleBeanConsumer将会得到一个单例SimpleBean的链接。第二个配置是完全错误的,因为Spring会创建一个SimpleBean的单例bean,但是SimpleBeanConsumer将获得另一个SimpleBean实例(也就是相当于直接调用new SimpleBean() ,这个bean是不归Spring管理的),既new SimpleBean() 实例是Spring上下文控件之外的

③:原因总结

使用@configuration,所以标记为@bean的方法将被包装成一个CGLIB包装器,他的工作方式就好像是这个方法的第一个调用,那么原始的主体将被执行,最终的对象在spring上下文中注册。所有进一步的调用只返回从上下文检索的bean。

在上面的第二个代码块中,新的SimpleBeanConsumer(simpleBean)只调用一个纯java方法。为了纠正第二个代码块,我们可以这样做

@Component
public static class Config {@AutowiredSimpleBean simpleBean;@Beanpublic SimpleBean simpleBean() {return new SimpleBean();}@Beanpublic SimpleBeanConsumer simpleBeanConsumer() {return new SimpleBeanConsumer(simpleBean);}
}

Spring @Configuration vs @Component
基本概念:@Configuration 和@Bean

五:spring MVC 模块注解

①:web模块常用到的注解

  • @Controller:表明该类会作为与前端作为交互的控制层组件,通过服务接口定义的提供访问应用程序的一种行为,解释用户的输入,将其转换成一个模型然后将试图呈现给用户。
@Controller
public class HappyController {//do something
...
}

spring MVC 使用@Controller定义控制器,他还允许自动检测定义在类路径下的组件(配置文件中配置扫描路径)并自动注册。

  • @RequestMapping:这个注解用于将url映射到整个处理类或者特定的处理请求的方法。可以只用通配符!
@Controller
@RequestMapping("/happy")
public class HappyController  {@Autowiredprivate HappyService happyService;@RequestMapping(/hello/*)public void sayHello(){//请求为 /happy/hello/* 都会进入这个方法!//例如:/happy/hello/123   /happy/hello/adb//可以通过get/post 请求}@RequestMapping(value="/haha",method=RequestMethod.GET)public void sayHaHa(){//只能通过get请求}
...
}

@RequestMapping既可以作用在类级别,也可以作用在方法级别。当他定义在类级别时,标明该控制器处理所有的请求都被映射到/favsoft路径下。@RequestMapping中可以使用method属性标记其所接受的方法类型,如果不指定方法类型的话,可以使用HTTP GET/POST方法请求数据,但是一旦指定方法类型,就只能使用该类型获取数据。

  • @RequestParam:将请求的参数绑定到方法中的参数上,有required参数,默认情况下,required=true,也就是改参数必须要传,如果改参数可以传可以不传,可以配置required=false。
 @RequestMapping("/happy")public String sayHappy(@RequestParam(value = "name", required = false) String name,@RequestParam(value = "age", required = true) String age) {//age参数必须传 ,name可传可不传...}
  • @PathVariable : 该注解用于方法修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定)。
@RequestMapping(value="/happy/{dayid}",method=RequestMethod.GET)
public String findPet(@PathVariable String dayid, Model mode) {
//使用@PathVariable注解绑定 {dayid} 到String dayid
}

@PathVariable中的参数可以是任意的简单类型,如int, long, Date等等。Spring会自动将其转换成合适的类型或者抛出 TypeMismatchException异常。当然,我们也可以注册支持额外的数据类型。
@PathVariable支持使用正则表达式,这就决定了它的超强大属性,它能在路径模板中使用占位符,可以设定特定的前缀匹配,后缀匹配等自定义格式。

  • @RequestBody : @RequestBody是指方法参数应该被绑定到HTTP请求Body上。
@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body,@RequestBody User user){//可以绑定自定义的对象类型
}

@ResponseBody : @ResponseBody与@RequestBody类似,它的作用是将返回类型直接输入到HTTP response body中。

  • @ResponseBody在输出JSON格式的数据时,会经常用到。
@RequestMapping(value = "/happy", method =RequestMethod.POST)
@ResponseBody
public String helloWorld() {
return "Hello World";//返回String类型
}

@RestController :控制器实现了REST的API,只为服务于JSON,XML或其它自定义的类型内容,@RestController用来创建REST类型的控制器,与@Controller类型。@RestController就是这样一种类型,它避免了你重复的写@RequestMapping与@ResponseBody。
@ModelAttribute :@ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。

该方法支持与@RequestMapping一样的参数类型,但并不能直接映射成请求。控制器中的@ModelAttribute方法会在@RequestMapping方法调用之前而调用。

@ModelAttribute方法有两种风格:一种是添加隐形属性并返回它。另一种是该方法接受一个模型并添加任意数量的模型属性。用户可以根据自己的需要选择对应的风格。

六:Spring事务模块注解

①:常用到的注解

在处理dao层或service层的事务操作时,譬如删除失败时的回滚操作。使用**@Transactional** 作为注解,但是需要在配置文件激活

<!-- 开启注解方式声明事务 --><tx:annotation-driven transaction-manager="transactionManager" />

②:举例

@Service
public class CompanyServiceImpl implements CompanyService {@Autowiredprivate CompanyDAO companyDAO;@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)public int deleteByName(String name) {int result = companyDAO.deleteByName(name);return result;}...
}

③:总结

事务的传播机制和隔离机制比较重要!

一图学习 Spring事务传播性

readOnly : 事务的读写属性,取true或者false,true为只读、默认为false

rollbackFor : 回滚策略,当遇到指定异常时回滚。譬如上例遇到异常就回滚

timeout (补充的) : 设置超时时间,单位为秒

isolation : 设置事务隔离级别,枚举类型,一共五种

透彻的掌握 Spring 中@transactional 的使用 Spring事务配置及事务的传播性与隔离级别详解

七:参考博文

原文链接:https://blog.csdn.net/u010648555/article/details/76299467

Spring注解之精进之路--超级详解相关推荐

  1. 三十七、缓存注解@Cacheable、@CacheEvict、@CachePut详解

    #        缓存注解@Cacheable.@CacheEvict.@CachePut详解 ##一.@Cacheable用法详解 ###1.用在哪里?     用在方法或者类上. ###2.这两种 ...

  2. Spring面向切面编程(AOP)详解

    Spring面向切面编程(AOP)详解 面向切面编程(AOP)是Spring框架的另外一个重要的核心内容. 而在讲AOP之前,先来了解一下动态代理这个概念,因为AOP基于动态代理. 动态代理概念:在程 ...

  3. 在VM虚拟机中 CentOS7安装VMware Tools(超级详解)

    ** 在VM虚拟机中的CentOS7的linux系统中安装VMware Tools(超级详解) ** 一.明白为什么这么做? 为什么要安装vmtools? vmtools 安装后,可以让我们在wind ...

  4. Spring Boot 使用 HikariCP 连接池配置详解

    Spring Boot 使用 HikariCP 连接池配置详解 HikariCP 是一个高性能的 JDBC 连接池组件. Spring Boot 2.x 将其作为默认的连接池组件,项目中添加 spri ...

  5. Python编程实例-Tkinter GUI编程基础超级详解

    Tkinter GUI编程基础超级详解 1.什么是Tkinter Python 有很多 GUI 框架,但 Tkinter 是唯一内置到 Python 标准库中的框架. Tkinter 有几个优势. 它 ...

  6. Spring三级缓存解决循环依赖问题详解

    spring三级缓存解决循环依赖问题详解 前言 这段时间阅读了spring IOC部分的源码.在学习过程中,自己有遇到过很多很问题,在上网查阅资料的时候,发现很难找到一份比较全面的解答.现在自己刚学习 ...

  7. Spring使用指南 ~ 4、ApplicationContext 配置详解

    ApplicationContext 配置详解 一.应用程序事件 package com.luo.spring.guides.event.xml;import org.springframework. ...

  8. 第15章-Spring AOP切点表达式(Pointcut)详解

    文章目录 一.概述 二.切点表达式配置 1. 内置配置 2. 注解配置 3. 公共配置 二.切点表达式类型 **`execution`** **`within`** **`this`** **`tar ...

  9. [Spring mvc 深度解析(一)] 详解Servlet

    详解Servlet ​ Servlet是Server+Applet的缩写,表示一个服务器应用.通过上面的分析我们知道Servlet其实就是一套规范,我们按照这套规范写的代码就可以直接在Java的服务器 ...

  10. spring框架使用Quartz执行定时任务实例详解

    版权声明:本文为博主原创文章,如需转载,请标明出处. https://blog.csdn.net/alan_liuyue/article/details/80382324 Quartz简介 1.Qua ...

最新文章

  1. MySQL 存储过程初研究
  2. 总结一下一般游戏中3D模型各种勾边方法遇到的工程性问题
  3. win7组策略-计算机配置,win7系统组策略设置系统配置模块的操作方法
  4. fillstyle属性_html设置或返回用于填充绘画的颜色渐变或模式的属性fillStyle
  5. 有的日期输入框,可直接调用javascripts
  6. iOS HTML标签字符实体,转译字符串归类大全 【转载】
  7. Nginx系列1之部分模块详解
  8. 2019最佳工作、平均年薪达百万!想入行,先看这10本书
  9. mybatis批量删除和插入
  10. Qt线程和signal-slot
  11. 4G内存为什么会少800M
  12. tomcat服务器配置优化
  13. Reinforcement Learning by David Silver 学记记录
  14. git分支详细讲解,模拟分支开发,为什么使用分支开发
  15. 【转载】google搜索从入门到精通
  16. bmp图片转换成16进制数据
  17. 玉堂金阙百度云php100,玉堂金阙(全二册)
  18. 有 50 家人家,每家一条狗。有一天警察通知, 50 条狗当中有病狗,行为和正常狗不一样。每人只能通过观察别 人家的狗来判断自己家的狗是否生病,而不能看自己家的狗,如果判断出自己家的狗病了,就必须当天
  19. AVS3变换系数编码:SRCC
  20. 晶振保存和使用中的注意事项

热门文章

  1. 一文带你了解影响因子IF和SCI分区
  2. java桌球小游戏使用图片_java桌球小游戏 小球任意角度碰撞
  3. 想自己做个网站,常用的自助建站哪个好呢?需要注意什么
  4. 手机网页点击按钮给指定号码发送短信
  5. dot全称_dot是什么格式的文件?dot文件如何打开?
  6. SuperMap标注
  7. 【修电脑】每次关机提示rundll32.exe程序没有响应,修改注册表解决问题
  8. 三分钟搭建你的个人支付接口
  9. 大数据解决方案,案例分享
  10. 190824-英雄联盟传记爬取