Java Spring框架的注解式开发你了解吗

目录
  • 1.Spring框架的注解式开发
    • 1.1开启注解扫描配置
    • 1.2实例化相关注解
    • 1.3控制对象的创建次数的注解
    • 1.4注入相关的注解
    • 1.5控制事务的相关注解
  • 总结

1. Spring框架的注解式开发

# Spring框架的注解式(Annotation)开发
1. 注解式开发
	定义:通过Spring框架提供的一系列注解来完成项目中快速开发
	注解:Annotation是java中一种特殊的类 类似于interface 使用时:@注解类名(属性=参数) @Param(Mybatis中做参数绑定的注解)
	注意:Spring框架提供的这些注解日后仅仅能在和Spring去做一系列项目的时候去用,这是Spring框架为我们提供的。
	为什么Spring框架要提供这么一套注解去帮助我们呢,原因是现有的开发方式中开发效率很低下,随着组件的增多,
	比如UserService、UserAction...大家会发现在做现有的配置文件进行开发时,每写一个业务层,就需要在spring.xml
	文件中通过bean标签去注册,有的时候忘了在工厂中注册的时候,用的时候还会产生空指针异常问题。所以Spring框架为了让大家
	专注于业务逻辑处理,不想每次开发一个组件时还要去写一个配置,每次开发一个组件时还需要写一个配置这样是不是影响了开发
	效率啊。所以Spring框架就想了,能不能为程序员提供一种便利呢,这种便利就是日后不需要它再做配置就完成工厂创建、注入
	相关的一些操作,怎么去做呢。所以在Spring中它给我们提供了一系列的相关注解帮助我们去做快速开发。
2. spring中的注解
	前置条件:必须在工厂配置文件中完成注解的扫描
			<!--下面这个标签就是用来做注解扫描的 base-package:指定扫描哪些包的注解-->
			<context:component-scan base-package="com.baizhi">
			在用注解的时候能让spring框架去看到这些注解或者说去扫描到这些注解,
			那spring框架怎么去读呢,spring有一个spring.xml这样的一个配置文
			件,是不是得让加载这个配置时要通过这个配置文件扫描到注解啊。
	1). 创建对象相关注解
		  @Component注解		通用组件创建注解	父类注解
		  	  作用:用来负责对象的创建 ==========> 简化<bean class="" id="">
		  	  修饰范围:只能用在类上
		  	  注意:默认使用这个注解在工厂中创建的对象的唯一标识为 类名首字母小写  UserDAOImpl ===> userDAOImpl
		  	  value属性的作用:用来指定创建的对象在工厂中的唯一标识  推荐:存在接口则名字设置为接口首字母小写 不存在使用默认
		  	  @Component("userDAO") 等价于 @Component(value = "userDAO")
		   子类注解:沿用了父类注解的一切特性,也就是说下面三个注解也能用来创建对象
		   		@Repository		作用:一般用来创建DAO中组件的注解
                @Service		作用:一般用来创建Service中组件的注解
                @Controller		作用:一般用来创建Action中组件的注解
	2). 控制对象在工厂中创建次数		默认工厂单例创建
			a. 配置文件修改	<bean class="" id="" scope="singleton|prototype">
			b. 注解如何控制
			@Scope
				作用:	  用来指定对象的创建次数默认单例
				修饰范围:只能加在类上
				value属性:singleton 单例 默认|prototype 多例
				@Scope("prototype") =====> 等价于 @Scope(value = "prototype")
				@Scope("singleton") =====> 等价于 @Scope(value = "singleton")默认是单例,如果想设置为单例,可以不写
				注意:在管理structs的action时必须加入@Scope注解值必须为prototype
	3). 属性注入的相关注解
			下面两个都能用
			a. spring框架提供的	@Autowired :注意 默认根据类型进行注入	推荐
			b. javaEE本身就有的	@Resource  :注意 默认根据名字注入,名称找不到时自动根据类型进行注入
			修饰范围:用在类中的成员变量或者是用在类中成员变量的SET方法上
			作用	 :用来完成成员变量的赋值|注入操作
			注意:使用注解进行注入时,日后注入的成员变量可以不再提供SET方法
	4). 控制事务的注解
		@Transactional
			作用:用来给类种方法加入事务控制 简化配置文件中 两段配置 1. 事务通知及事务细粒度配置	2. 简化事务切面配置
			修饰范围:类	| 方法上	局部优先原则
            		1. 加载类上	代表类中所有方法加入事务控制
            		2. 加在方法上 代表当前方法加入事务控制
            		3. 类和方法同时存在	方法优先
            使用要求:如果想要让@Transactional这个注解生效必须在配置文件中加入如下注解:
                    <!--开启注解式事务生效-->
                    <!--必须是tx结尾的包下的-->
                    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
            注解属性:
            @Transactional(propagation = Propagation.SUPPORTS,
                        isolation = Isolation.READ_COMMITTED,
                        rollbackFor = {java.lang.RuntimeException.class},
                        noRollbackFor = {},
                        readOnly = false,
                        timeout = -1)   // 当然这些都推荐大家使用默认,唯独有一个方法有点特殊,就是查询方法,不需要去明确										  // 的把它加入事务,所以建议在查询方法上@Transactional(propagation =                                               //Propagation.SUPPORTS)让它去支持事务
 注意:使用了@Transactional注解代理原有配置文件中的创建事务环绕通知细粒度控制和配置事务切面这两段配置
    <!--创建事务环绕通知并进行事务细粒度控制-->
    <!--transaction-manager找ref -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*"/>
            <tx:method name="update*"/>
            <tx:method name="delete*"/>
            <tx:method name="find*" propagation="SUPPORTS"/>
        </tx:attributes>
    </tx:advice>
    <!--配置事务切面-->
    <aop:config>
        <aop:pointcut id="pc" expression="execution(* com.baizhi.service.*ServiceImpl.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
    </aop:config>
    但是下面的这些配置该写还得写
    <!--创建数据源-->
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/lb?characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>
    <!--创建sqlSessionFactoy-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
        <!--注入datasource mapperLocations typeAliasesPackage-->
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath:com/baizhi/mapper/*.xml"/>
        <property name="typeAliasesPackage" value="com.baizhi.eneity"/>
    </bean>
    <!--创建DAO-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--注入sqlSessionFactory dao接口所在包-->
        <!--value要的是sqlSessionFactory在工厂中的名字-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <property name="basePackage" value="com.baizhi.dao"/>
    </bean>
    <!--创建事务管理器-->
    <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

1.1 开启注解扫描配置

	<!--开启注解扫描-->
  <context:component-scan base-package="com.baizhi"/>

1.2 实例化相关注解

# 1. @Component(value="userService")
				修饰范围:    用在类上
				注解作用:    通用的创建实例的注解,用来创建当前这个类的实例
				value属性:  用来指定创建的对象在工厂中的唯一标识   如果不指定默认创建对象在工厂中的标识为类名首字母小写
# 2. @Repository
				修饰范围:    用在类上
				注解作用:    @component的子类注解专用于DAO组件的创建,通常加在DAO组件上
				value属性:  用来指定创建的对象在工厂中的唯一标识   如果不指定默认创建对象在工厂中的标识为类名首字母小写
# 3. @Service
				修饰范围:    用在类上
				注解作用:    @component的子类注解专用于Service组件的创建,通常加在Service组件上
				value属性:  用来指定创建的对象在工厂中的唯一标识   如果不指定默认创建对象在工厂中的标识为类名首字母小写
# 4. @Controller
			    修饰范围:    用在类上
				注解作用:    @component的子类注解专用于Action组件的创建,通常加在Action组件上
				value属性:  用来指定创建的对象在工厂中的唯一标识   如果不指定默认创建对象在工厂中的标识为类名首字母小写
	注:除了以上三种DAO、Service、Action三种组件分别创建时使用三种子类注解,其余的组件创建时使用 @Component注解
@Repository("userDAO")
public class UserDAOImpl implements UserDAO{
@Service("userService")public class UserServiceImpl implements UserService{

1.3 控制对象的创建次数的注解

 # 1. @Scope(value="singleton|prototype")
 			  	修饰范围:    用在类上
			  	注解作用:    用来控制这个实例在工厂中的创建次数
				value属性:   singleton为单例,prototype为多例   默认单例
@Service("userService")
@Scope("prototype")
public class UserServiceImpl implements UserService{

1.4 注入相关的注解

# 1. @Autowired(Spring提供)
				修饰范围:    用在成员变量或成员变量的GET/SET方法上
				注解作用:	 用来给类中成员变量赋值
				注入原则:    默认根据类型自动注入
# 2. @Resource(JAVAEE提供)
				修饰范围:    用在成员变量或成员变量的GET/SET方法上
				注解作用:    用来给类中成员变量赋值
				注入原则:    默认根据名称自动注入名称找不到根据类型自动注入
	注意:使用注解进行注入时,日后注入的成员变量可以不再提供SET方法
@Service("userService")
@Scope("prototype")
public class UserServiceImpl implements UserService{
    @Autowired
    private UserDAO userDAO;

1.5 控制事务的相关注解

# 1. @Transactional
			    修饰范围:    用在类上主要用在业务层组件类上或者是方法上
				注解作用:   用来给类中方法加入事务,当类上和方法上同时存在该注解时局部优先
				注解属性:
							propagation  用来控制传播属性				赋值时使用枚举类
							Isolation    用来控制隔离级别				赋值时使用枚举类	一般使用默认
							timeout      用来设置超时性                 赋值代表超时时间	一般使用默认
							rollback-for 用来设置什么异常回滚			   赋值时给class	 一般使用默认
							norollback-for 用来设置什么异常不会滚		  赋值时给class      一般使用默认
							readonly     用来设置事务读写性				true/false       一般使用默认
				注意:如果要使用事务注解在配置文件中必须开启事务注解生效加入如下配置:
				    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
	使用事务相关注解只可以简化配置文件中 两段配置 1. 事务通知及事务细粒度配置	2. 简化事务切面配置
	但是其他的比如创建数据源、创建sqlSessionFactoy、创建DAO、创建事务管理器还是要写的
	因为对于增、删、改的事务属性我们一般都使用默认,在进行事务控制时只需要在类上加一个@Transactional即可,属性不写即
	代表使用默认,但是对于查询方法我们要加入局部注解@Transactional(propagation = Propagation.SUPPORTS)使查询
	方法支持事务
// 事务的使用 一般在给类加控制事务的注解时,不修改属性,使用默认,下面只是为了演示注解的使用
@Service("userService")
@Scope("prototype")
@Transactional(propagation = Propagation.SUPPORTS,
                isolation = Isolation.READ_COMMITTED,
                rollbackFor = {java.lang.RuntimeException.class},
                noRollbackFor = {},
                readOnly = false,
                timeout = -1)   // 当然这些都推荐大家使用默认,唯独有一个方法有点特殊,就是查询方法,不需要去明确的
                                // 把它加入事务,所以建议在查询方法上@Transactional(propagation = Propagation.SUPPORTS)
                                // 让它去支持事务
public class UserServiceImpl implements UserService{
// 平常使用
@Service("userService")
@Scope("prototype")
public class UserServiceImpl implements UserService{
    @Autowired
    private UserDAO userDAO;
    public void save(String name) {
        userDAO.save(name);
        System.out.println("Service:" + name);
    }
    @Transactional(propagation = Propagation.SUPPORTS)
    public void find() {
    }
}

注意:在使用控制事务的注解时,需要给类加上不修改任何属性的注解@Transactional,另外还需要给find查询方法加上局部注解@Transactional(propagation = Propagation.SUPPORTS)

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • CSS的三大样式你了解多少

    目录 CSS样式 行内式 内部式 外部式 多重样式优先级 总结 CSS样式 行内式 又叫:内联样式.行内样式.嵌入式样式 <!-- style作为属性直接写在标签后面, style属性可以包含任何 CSS属性 --> <div style="font-size: 40px; color: #FF0000;">我是div</div> <div style="font-size: 40px; color: blue;">我

  • Spring MVC注解式开发使用详解

    MVC注解式开发即处理器基于注解的类开发, 对于每一个定义的处理器, 无需在xml中注册. 只需在代码中通过对类与方法的注解, 即可完成注册. 定义处理器 @Controller: 当前类为处理器 @RequestMapping: 当前方法为处理器方法, 方法名随意, 对于请求进行处理与响应. @Controller public class MyController { @RequestMapping(value = "/hello.do") public ModelAndView

  • 带你详细了解Spring Security的注解方式开发

    目录 默认情况下,不会开启注解,如果想用注解,需要开启注解支持. 总结 默认情况下,不会开启注解,如果想用注解,需要开启注解支持. 在启动类上开启: @EnableGlobalMethodSecurity(securedEnabled = true) @SpringBootApplication @ComponentScan(basePackages = {"com.example"}) // 开启springSecurity注解支持 @EnableGlobalMethodSecuri

  • Java Spring详解如何配置数据源注解开发以及整合Junit

    目录 Spring数据源的配置 数据源(连接池)的作用 数据源的开发步骤 手动创建数据源 Spring注解开发 Spring原始注解 Spring新注解 Spring整合Junit Spring集成Junit步骤 Spring数据源的配置 数据源(连接池)的作用 数据源(连接池)是提高程序性能如出现的 事先实例化数据源,初始化部分连接资源 使用连接资源时从数据源中获取 使用完毕后将连接资源归还给数据源 常见的数据源(连接池):DBCP.C3PO.BoneCP.Druid等 数据源的开发步骤 1.

  • 详解spring如何使用注解开发

    在Spring4之后,要使用注解开发,必须要保证aop的包导入了. 使用注解需要导入context约束,增加注解的支持. <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance

  • Java之Spring注解开发案例详解

    在Spring4之后,要使用注解开发,必须要保证aop的包导入了 使用注解需要导入context约束,增加注解的支持! <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&

  • Java Spring框架的注解式开发你了解吗

    目录 1.Spring框架的注解式开发 1.1开启注解扫描配置 1.2实例化相关注解 1.3控制对象的创建次数的注解 1.4注入相关的注解 1.5控制事务的相关注解 总结 1. Spring框架的注解式开发 # Spring框架的注解式(Annotation)开发 1. 注解式开发 定义:通过Spring框架提供的一系列注解来完成项目中快速开发 注解:Annotation是java中一种特殊的类 类似于interface 使用时:@注解类名(属性=参数) @Param(Mybatis中做参数绑定

  • Spring框架基于注解开发CRUD详解

    Spring框架基于注解开发CRUD,供大家参考,具体内容如下 1. Maven坐标 <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency>     <groupId>org.springframework</groupId>     <artifactId>spring-webmvc</artifactId>

  • Java Spring框架简介与Spring IOC详解

    目录 Spring简介和配置 1.Spring概述 1.1 spring 是什么 1.2 Spring发展历程 1.3 Spring的优势 (理解) \1. 方便解耦,简化开发 \2. AOP 编程的支持 \3. 声明式事务的支持 \4. 方便程序的测试 \5. 方便集成各种优秀框架 \6. 降低 JavaEE API 的使用难度 \7. Java 源码是经典学习范例 1.4 Spring的体系结构(了解) 2.Spring IoC快速入门 2.1 IoC的概念和作用 2.2 Spring Io

  • 在Java Spring框架中使用的设计模式有哪些

    目录 1 简单工厂模式 2 工厂方法模式 3 单例模式 4 代理模式 好处 静态代理 动态代理 1 简单工厂模式 当A对象需要调用B对象的方法时,我们需要在A中new一个B的实例,我们把这种方式叫作硬编码耦合,缺点是一旦需求发生变化,比如需要使用C类来代替B时,就要改写A类的方法. 假如应用中有上千个类以硬编码的方式耦合了B,改就很头疼. 于是有了简单工厂模式,又叫静态工厂方法,就是由一个工厂类根据传入参数,动态决定应该创建哪个产品类. Spring中的BeanFactory就是简单工厂模式的体

  • Java Spring框架创建项目与Bean的存储与读取详解

    目录 1.Spring项目的创建 1.1创建Maven项目 1.2添加spring依赖 1.3创建启动类 1.4配置国内源 2.储存或读取Bean对象 2.1添加spring配置文件 2.2创建Bean对象 2.3读取Bean对象 本文思维导图: 1.Spring项目的创建 1.1创建Maven项目 第一步,创建Maven项目,Spring也是基于Maven的. 1.2添加spring依赖 第二步,在Maven项目中添加Spring的支持(spring-context, spring-beans

  • Spring框架基于注解的AOP之各种通知的使用与环绕通知实现详解

    目录 一.基于注解的AOP之各种通知的使用 二.基于注解的AOP之环绕通知 一.基于注解的AOP之各种通知的使用 1.在切面中,需要通过指定的注解将方法标识为通知方法 @Before:前置通知,在目标对象方法执行之前执行 @After:后置通知,在目标对象方法的finally子句中执行 @AfterReturning:返回通知,在目标对象方法返回值之后执行 @AfterThrowing:异常通知,在目标对象方法的catch子句中执行 声明重用写入点表达式 @Pointcut("execution

  • Java Spring框架的概述

    目录 Spring框架概述 IOC容器 IOC概念和原理 什么是IOC IOC底层原理 IOC接口 IOC操作Bean管理 IOC操作Bean管理(xml) 基于xml方式创建队形 基于xml方式注入属性 总结 Spring框架概述 Spring是轻量级的开源的JAVAEE框架 Spring可以解决企业应用开发的复杂性 Spring有两个核心部分:IOC和Aop IOC:控制反转,把创建对象的过程交个Spring进行管理 Aop:面向切面,不修改源代码进行功能增强 Spring特点 方便解耦,简

  • Java Spring的使用注解开发详解

    目录 使用注解开发 1.bean 2.属性如何注入 3.衍生的注解 4.自动装配 5.作用域 6.小结 代码show 1.新建一个模块: 2.新建pojo包及类 3.新建dao包及类 4.新建service包及类 5.新建controller包及类 6.新建配置文件applicationContext.xml 7.测试 彩蛋 总结 使用注解开发 在Spring4之后,要使用注解开发,必须要保证aop的包导入了 使用注解需要导入context的约束,增加注解的支持 <?xml version=&quo

随机推荐