返回顶部
首页 > 资讯 > 精选 >spring常用注解的示例分析
  • 408
分享到

spring常用注解的示例分析

spring 2023-05-30 21:05:49 408人浏览 独家记忆
摘要

这篇文章给大家分享的是有关spring常用注解的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 、将普通类加入容器形成Bean的注解日常开发中主要使用到的定义Bean的注解包括(XML方式配置bean暂

这篇文章给大家分享的是有关spring常用注解的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1 、将普通类加入容器形成Bean的注解

日常开发中主要使用到的定义Bean的注解包括(XML方式配置bean暂不讨论):

@Component、@Repository、@Service、@Controller、@Bean

其中@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。当一个组件代表数据访问层(Dao)时,你可以给它加上@Repository注解,如下例:

@Repositorypublic class BiliapiDaoImpl implements BiliAPIDao {private final static Logger LOGGER = LoggerFactory.getLogger(BiliAPIDaoImpl.class); private BiliAPIHttpClient asoAPIHttpClient;public void execute(){  //some logic business }}

当组件用于业务层时,使用@Service注解,如下例:

@Service(value="SecUserService")public class SecUsersServiceImpl implements SecUsersService { @Autowired private SecUsersDao secUsersDao; @Autowired private SecRoleUserService secRoleUserService; public void doBusiness(){  //do some business } }

注意,在此处的@Service注解中额外添加了value=”SecUserService”的属性,为何对此一举呢?value属性可以指定生成后Bean的名称,这个名称便成为容器中bean 的唯一标识符。同样的,在@Component、@Repository、@Controller也均可以指定其value值,当然,是如有必要时加

当组件属于控制层时,则使用@Controller注解;当组件不能进行很好地归类时,那我们可以使用@Component注解。因使用方式均相同,故此处不再继续贴代码

在这几个注解中,额外需要留意的是@Bean注解。不妨看代码:

@Componentpublic class FactoryMethodComponent {  private static int i;  @Bean @Qualifier("public") public TestBean publicInstance() {  return new TestBean("publicInstance"); }  // use of a custom qualifier and autowiring of method parameters  @Bean protected TestBean protectedInstance(@Qualifier("public") TestBean spouse,          @Value("#{privateInstance.age}") String country) {  TestBean tb = new TestBean("protectedInstance", 1);  tb.setSpouse(tb);  tb.setCountry(country);  return tb; }  @Bean @Scope(BeanDefinition.SCOPE_SINGLETON) private TestBean privateInstance() {  return new TestBean("privateInstance", i++); }  @Bean @Scope(value = WEBApplicationContext.SCOPE_SESSION,    proxyMode = ScopedProxyMode.TARGET_CLASS) public TestBean requestScopedInstance() {  return new TestBean("requestScopedInstance", 3); }}

Bean注解主要用于方法上,有点类似于工厂方法,当使用了@Bean注解,我们可以连续使用多种定义bean时用到的注解,譬如用@Qualifier注解定义工厂方法的名称,用@Scope注解定义该bean的作用域范围,譬如是singleton还是prototype等。

此处还得另外提一个注解: @Configuration.实际上,上面谈到的@Bean注解更多时候是与@Configuration注解在一起使用的。如果将一个类标注为@Configuration注解,那么也就意味着这个class将会作为创建各种bean的工厂(类似于一个新的容器)。最简单的配合使用示例如下:

@Configurationpublic class AppConfig { @Bean public MyService myService() {  return new MyServiceImpl(); }}

以上的代码实际上等价于Xml中的配置:

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

我们还需要注意的一点,在Spring的@Component注解中使用@Bean与在Spring中的@Configuration使用是一定的差别的。在使用@Component的类中不会强制使用CGLIB代理拦截方法和属性。而在@Configuration类中,则会使用CGLIB代理去调用@Bean标注的方法并返回对象的引用。在@Configuration注解中使用@Bean也可以防止同一个@Bean方法被意外调用多次时而产生细微的难以排查的错误

2、从容器中取Bean(装配bean)时常用的注解

开发中最常用到的用于装配的注解是:@Autowired和@Resource

@Autowired注解:

public class MovieRecommender {  @Autowired private MovieCatalog movieCatalog;  private CustomerPreferenceDao customerPreferenceDao;  @Autowired public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {  this.customerPreferenceDao = customerPreferenceDao; }  // ...}

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

@Resource注解
对于@Resource注解,它并不属于spring的注解,而是来自于jsR-250。其默认情况下按照bean的名称进行注入,当找不到匹配项时会按照类型装配。当按照名称进行装配时,可以指定其name属性,倘若没有指定,注解标注在哪个字段上,其默认名称就是那个字段的名称。当然,@Resource注解也支持按指定类型进行装配,给它的type属性赋特定类型的值即可(注意,当指定了name属性后,只能按照名称装配)

public class SpringAnotationDemo {  @Bean @Qualifier("httpApiClient") public HttpApiClient createHttpClient() {  return new HttpApiClient(); }  @Resource(name = "httpApiClient") private HttpApiClient httpApiClient; @Resource(type = XQSmsHttpClient.class) private SmsHttpClient smsHttpClient;}

依我个人理解,其实@Resource要比@Autowired好用得多,@Resource注解的使用性更为灵活,可指定名称,也可以指定类型 ,而用@Autowired注解进行装配容易抛出异常,特别是装配的bean类型有多个的时候,而解决的办法是需要在增加@Qualitied进行限定

vc模块注解">3、spring mvc模块注解
web模块常用到的注解包括:

@Controller、@RequestMapping、@RequestParam、@PathVariable

@Controller
将一个类加上@Controller注解后,表明该类会作为与前端作交互的控制层组件

@Controllerpublic class CompanyController {...}

@RequestMapping
这个注解用于将url映射到整个处理类或者特定的处理请求的方法

@Controller@RequestMapping("/company")public class CompanyController {  @Autowired private CompanyService companyService;...}

如上例,当标注在class上时,表明此类会接收url为”/company”请求

@RequestParam
用于绑定request请求参数到指定的方法

@Controller@RequestMapping("/company")public class CompanyController {  @Autowired private CompanyService companyService;  @RequestMapping("/companyList") public String listCompanies(Map<string, object=""> map,     @RequestParam(value = "data", required = false) String data,    @RequestParam(value = "phone_num", required = true) String phoneNum) { map.put("data", data); map.put("phoneNum", phoneNum); return "companyList"; }...}

譬如上例中,@RequestParam请求参数指定了传入参数的具体字段名(value指定的),以及是否必须传的字段(默认情况下,required=true)。data,phoneNum为形参,即请求参数的使用名,可以更改

@PathVariable
该注解用于方法修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定),请看如下栗子:

@Controller@RequestMapping("/company")public class CompanyController {  @Autowired private CompanyService companyService;  @RequestMapping("{companyName}") public String getCompany(Map<string, object=""> map,    @PathVariable String companyName) { Company company = companyService.findByName(companyName); map.put("company", company); return "company"; }...}

当我们请求 “/compony/account”时,componyName会动态地绑定为”account”

4、事务模块注解@Transactional

在处理dao层或service层的事务操作时,譬如删除失败时的回滚操作,可用到@Transactional注解,如下例:

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

上例表明,执行deleteByName方法时,启用了事务处理,事务的各属性含义如下:

propagation
事务的传播行为,spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时如何进行传播:

事务传播行为类型描述
PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常
PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作

注:第一种是最常用的,默认的

readOnly
事务的读写属性,取true或者false,true为只读、默认为false rollbackFor
回滚策略,当遇到指定异常时回滚。譬如上例遇到异常就回滚 timeout (补充的)
设置超时时间,单位为秒 isolation
设置事务隔离级别,枚举类型,一共五种

类型描述
DEFAULT采用数据库默认隔离级别
READ_UNCOMMITTED读未提交的数据(会出现脏读取)
READ_COMMITTED读已提交的数据(会出现幻读,即前后两次读的不一样)
REPEATABLE_READ可重复读,会出现幻读
SERIALIZABLE串行化(对资源消耗较大,一般不使用)

Spring aop模块注解
spring aop模块的注解主要有@Aspect、@Pointcut、@Before、@Around、@After、
@AfterReturning、@AfterThrowing

@Aspect
标明该类为切面类,并启用AspectJ注解,注:在使用时要同@Component一起使用,否则不会被扫描到加入容器

@Pointcut
定义切入点,关于切入点表达式书写方式,请移步官方文档:spring AOP文档

@Around
定义环绕通知,在目标方法执行前后嵌入相关业务逻辑

@Before
定义前置通知,在目标方法执行前执行

@After
定义后置通知,在目标方法执行后执行,不论是目标方法执行正常后退出,还是抛出异常后退出,均会被执行

@AfterReturning
目标方法执行正常退出后执行 @AfterThrowing
目标方法执行抛出异常后执行

感谢各位的阅读!关于“spring常用注解的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: spring常用注解的示例分析

本文链接: https://lsjlt.com/news/221589.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • spring常用注解的示例分析
    这篇文章给大家分享的是有关spring常用注解的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 、将普通类加入容器形成Bean的注解日常开发中主要使用到的定义Bean的注解包括(XML方式配置bean暂...
    99+
    2023-05-30
    spring
  • Spring注解解析之@ImportResource的示例分析
    这篇文章给大家分享的是有关Spring注解解析之@ImportResource的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、ImportResource1.1 定义包和类首先定义一个不会被Compo...
    99+
    2023-06-15
  • spring注解之@profile的示例分析
    这篇文章给大家分享的是有关spring注解之@profile的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。spring中@profile与maven中的profile很相似,通过配置来改变参数。例如在开...
    99+
    2023-05-31
    spring profile
  • Spring常用配置及解析类的示例分析
    这篇文章将为大家详细讲解有关Spring常用配置及解析类的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。springMVC配置用法的文章很多,但具体描述清楚的不多,这里主要介绍下常用的配置项的用法...
    99+
    2023-05-30
    spring
  • Spring依赖注入的示例分析
    这篇文章给大家分享的是有关Spring依赖注入的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一.依赖简介一个典型的企业应用程序不是由一个单一的对象组成(或Spring的说法中的bean)。即使是最简单的...
    99+
    2023-06-03
  • spring自定义校验注解ConstraintValidator的示例分析
    这篇文章主要介绍spring自定义校验注解ConstraintValidator的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、前言系统执行业务逻辑之前,会对输入数据进行校验,检测数据是否有效合法的。所以...
    99+
    2023-06-20
  • Spring@Autowired注解与自动装配的示例分析
    这篇文章主要介绍了Spring@Autowired注解与自动装配的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1 配置文件的方法我们编写spring 框架的代码时候...
    99+
    2023-05-31
    spring @autowired
  • SpringBoot常用注解实例分析
    这篇文章主要介绍“SpringBoot常用注解实例分析”,在日常操作中,相信很多人在SpringBoot常用注解实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot常用注解实例分析”的疑...
    99+
    2023-06-30
  • Spring的示例分析
    这篇文章将为大家详细讲解有关Spring的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。WHY在诞生之初,创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB。相对于E...
    99+
    2023-05-30
    spring
  • Spring AOP的示例分析
    这篇文章主要为大家展示了“Spring AOP的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring AOP的示例分析”这篇文章吧。Spring中对AOP的支持Spring中AOP...
    99+
    2023-05-30
    spring aop
  • Spring Ioc和DI注解实例分析
    今天小编给大家分享一下Spring Ioc和DI注解实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.Sp...
    99+
    2023-06-29
  • 常用的攻击手段SQL注入的示例分析
    这篇文章主要介绍常用的攻击手段SQL注入的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、概述1. 攻击原理SQL注入是较常见的网络攻击方式之一,主要针对WEB应用,利用程序员编写代码的疏忽,对于连接数据库...
    99+
    2023-06-27
  • Spring中Bean注入源码示例解析
    目录BeanDefinition和BeanBeanDefinition的注入BeanDefinitionRegistry接口BeanDefinitionRegistry的实现类Sim...
    99+
    2023-01-15
    Spring Bean注入 Spring源码解析
  • Spring之BeanPostProcessor的示例分析
    小编给大家分享一下Spring之BeanPostProcessor的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、简介BeanPostProcesso...
    99+
    2023-06-15
  • 初始Spring的示例分析
    小编给大家分享一下初始Spring的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为什么要使用SpringWhy SpringSpring makes p...
    99+
    2023-06-20
  • Spring Boot Starter的示例分析
    这篇文章给大家分享的是有关Spring Boot Starter的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Spring Boot 简介Spring框架功能很强大,但是就算是一个很简单的项目,我们也要...
    99+
    2023-05-31
    spring boot starter
  • Spring对IOC的示例分析
    这篇文章将为大家详细讲解有关Spring对IOC的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、IOC控制反转和DI依赖注入控制反转,字面可以理解为:主动权的转移,原来一个应用程序内的对象是类...
    99+
    2023-05-30
    spring ioc
  • Spring Cloud Config的示例分析
    这篇文章将为大家详细讲解有关Spring Cloud Config的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在我们了解spring cloud config之前,我可以想想一个配置中心提供的...
    99+
    2023-06-05
  • Spring注解驱动开发之属性赋值的示例分析
    这篇文章给大家分享的是有关Spring注解驱动开发之属性赋值的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、@Value注解在Person的属性上使用@Value注解指定注入值public ...
    99+
    2023-06-15
  • spring常用注解开发一个RESTful接口示例
    目录一、开发REST接口第一步:定义资源(对象)第二步:HTTP方法与Controller(动作)二、统一规范接口响应的数据格式一、开发REST接口 在本专栏之前的章节中已经给大家介...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作