首页 > 编程语言 >【浅谈JavaEE框架】Spring常用注解,自动扫描装配Bean

【浅谈JavaEE框架】Spring常用注解,自动扫描装配Bean

时间:2023-06-12 16:02:09浏览次数:42  
标签:事务 浅谈 propagation Spring Transactional JavaEE bean Propagation Bean


1.引入context命名空间(在Spring的配置文件中)

配置文件如下: 

Xml代码  

1.xmlns:context="http://www.springframework.org/schema/context"    
 2.http://www.springframework.org/schema/context  
3.http://www.springframework.org/schema/context/spring-context-2.5.xsd

打开配置 <context:component-scan base-package="包名(扫描本包及子包)"/> 

spring 会自动扫描cn.pic包下面有注解的类,完成Bean的装配。 

Xml代码  

<?xml version="1.0" encoding="UTF-8"?>    
<beans xmlns="http://www.springframework.org/schema/beans"    
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
       xmlns:context="http://www.springframework.org/schema/context"           
       xsi:schemaLocation="http://www.springframework.org/schema/beans    
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd    
           http://www.springframework.org/schema/context   
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">    
             
          <context:component-scan base-package="cn.pic"/>    
</beans>

2.在classPath中加入注解用的jar包 

lib\j2ee\common-annotations.jar

 

Spring 的context:component-scan扫描支持扫描jar包的方法:

 

eclipse自带的jar打包程序,默认打包的时候有个选项<Add directory entries>没有勾选,只要勾选了,就可以了.

 

-----------常用注解-------- 

--定义Bean的注解 

@Controller

 

@Controller("Bean的名称")

 

定义控制层Bean,如Action

 

 

@Service          

 

@Service("Bean的名称")

 

定义业务层Bean

 

 

@Repository   

 

@Repository("Bean的名称")

 

定义DAO层Bean

 

 

@Component  

 

定义Bean, 不好归类时使用.

 

 

--自动装配Bean (选用一种注解就可以)

 

@Autowired  (Srping提供的)

 

默认按类型匹配,自动装配(Srping提供的),可以写在成员属性上,或写在setter方法上

 

 

@Autowired(required=true)  

 

一定要找到匹配的Bean,否则抛异常。 默认值就是true 

 

 

@Autowired

 

@Qualifier("bean的名字") 

 

按名称装配Bean,与@Autowired组合使用,解决按类型匹配找到多个Bean问题。

 

 

@Resource   JSR-250提供的

 

默认按名称装配,当找不到名称匹配的bean再按类型装配.

 

可以写在成员属性上,或写在setter方法上

 

可以通过@Resource(name="beanName") 指定被注入的bean的名称, 要是未指定name属性, 默认使用成员属性的变量名,一般不用写name属性.

 

@Resource(name="beanName")指定了name属性,按名称注入但没找到bean, 就不会再按类型装配了.

 

 

@Inject   是JSR-330提供的

 

按类型装配,功能比@Autowired少,没有使用的必要。

 

 

--定义Bean的作用域和生命过程 

@Scope("prototype")

 

值有:singleton,prototype,session,request,session,globalSession

 

 

@PostConstruct 

 

相当于init-method,使用在方法上,当Bean初始化时执行。

 

 

@PreDestroy 

 

相当于destory-method,使用在方法上,当Bean销毁时执行。

 

--声明式事务 

@Transactional  

spring 事务注解

默认遇到throw new RuntimeException("...");会回滚

需要捕获的throw new Exception("...");不会回滚


// 指定回滚
@Transactional(rollbackFor=Exception.class) 
    public void methodName() {
       // 不会回滚
       throw new Exception("...");
    } 
//指定不回滚
@Transactional(noRollbackFor=Exception.class)
    public ItimDaoImpl getItemDaoImpl() {
        // 会回滚
        throw new RuntimeException("注释");
    }
// 如果有事务,那么加入事务,没有的话新建一个(不写的情况下)
    @Transactional(propagation=Propagation.REQUIRED) 
    // 容器不为这个方法开启事务
    @Transactional(propagation=Propagation.NOT_SUPPORTED)
    // 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
    @Transactional(propagation=Propagation.REQUIRES_NEW) 
    // 必须在一个已有的事务中执行,否则抛出异常
    @Transactional(propagation=Propagation.MANDATORY)
    // 必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
    @Transactional(propagation=Propagation.NEVER) 
    // 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
    @Transactional(propagation=Propagation.SUPPORTS) 
    /*
    public void methodName(){
       // 本类的修改方法 1
       update();
       // 调用其他类的修改方法
       otherBean.update();
       // 本类的修改方法 2
       update();
    }
    other失败了不会影响 本类的修改提交成功
    本类update的失败,other也失败
    */
@Transactional(propagation=Propagation.NESTED) 
// readOnly=true只读,不能更新,删除 
@Transactional (propagation = Propagation.REQUIRED,readOnly=true) 
// 设置超时时间
@Transactional (propagation = Propagation.REQUIRED,timeout=30)
// 设置数据库隔离级别
@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)


标签:事务,浅谈,propagation,Spring,Transactional,JavaEE,bean,Propagation,Bean
From: https://blog.51cto.com/u_16012040/6463182

相关文章

  • springboot kettle gralde dockerfile 多阶段构建
    dockerfileFROMopenjdk:8-jdk-alpineASTEMP_BUILD_IMAGEENVENVREFRESH_DATE2023-06-1215:00RUNset-eux&&sed-i's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g'/etc/apk/repositoriesRUNapkupdate&&apkadd--no-cacheb......
  • 浅谈API安全与人工智能生态
    随着人工智能技术的不断发展,API接口安全问题也日益凸显。API接口是现代互联网服务的核心组成部分,它提供了网络应用程序之间相互通信的方法,使得不同的软件和系统能够无缝地集成在一起,这为业务的快速部署和实现带来了巨大的便利性。然而,由于API接口开放性和易于使用的特点,同时也给......
  • 揭秘Spring依赖注入和SpEL表达式
    摘要:在本文中,我们深入探讨了Spring框架中的属性注入技术,包括setter注入、构造器注入、注解式属性注入,以及使用SpEL表达式进行属性注入。本文分享自华为云社区《Spring高手之路3——揭秘Spring依赖注入和SpEL表达式》,作者:砖业洋__。在本文中,我们深入探讨了Spring框架中的属性注......
  • 花了半天时间,使用spring-boot实现动态数据源,切换自如
      在一个项目中使用多个数据源的情况很多,所以动态切换数据源是项目中标配的功能,当然网上有相关的依赖可以使用,比如动态数据源,其依赖为,<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.1</v......
  • 浅谈动态规划
    什么是动态规划?动态规划\((\mathbb{D}ynamic~\mathbb{P}rograming)\)算法是解决\(\color{red}多阶段决策过程最优\)的通用方法。在这类问题中,可能有多个可行解。每一个解都对应着一个值,而我们希望找到的是\(\color{red}最优值的解\)。要了解动态规划的概念,首先要知道什么是......
  • Spring Boot实现高质量的CRUD-2
    (续前文)5、Dao类 ​​ Dao类提供操作访问数据库表的接口方法。常规的CRUD,将考虑下列接口方法:​ 1)插入单条对象记录;​ 2)批量插入对象记录;​ 3)修改单条对象记录;​ 4)批量修改对象记录;​ 5)删除单条对象记录;​ 6)批量删除对象记录;​ 7)查询多条对象记录;​ 8)查询指定key的对象记......
  • Jenkins + Docker 一键自动化部署 Spring Boot 项目,步骤齐全,少走坑路!
    本文章实现最简单全面的Jenkins+docker+springboot一键自动部署项目,步骤齐全,少走坑路。环境:centos7+git(gitee)简述实现步骤:在docker安装jenkins,配置jenkins基本信息,利用Dockerfile和shell脚本实现项目自动拉取打包并运行。推荐一个开源免费的SpringBoot实战项目:https://......
  • SpringBoot自带ThreadPoolTaskScheduler实现数据库管理定时任务
    最近做了一个需求:将定时任务保存到数据库中,并在页面上实现定时任务的开关,以及更新定时任务时间后重新创建定时任务。于是想到了SpringBoot中自带的ThreadPoolTaskScheduler。在SpringBoot中提供的ThreadPoolTaskScheduler这个类,该类提供了一个schedule(Runnabletask,Triggert......
  • Spring事件监听机制使用和原理解析
    你好,我是刘牌!前言好久没有更新Spring了,今天来分享一下Spring的事件监听机制,之前分享过一篇Spring监听机制的使用,今天从原理上进行解析,Spring的监听机制基于观察者模式,就是就是我们所说的发布订阅模式,这种模式可以在一定程度上实现代码的解耦,如果想要实现系统层面的解耦,那么消息......
  • java——微服务——spring cloud——Nacos——Nacos微服务配置拉取
       添加依赖:     添加bootstrap.yml文件    去除application.yml中和bootstrap.yaml中相同的配置项:      修改controller,验证配置更新功能            ......