浅谈spring 常用注解

我们不妨先将spring常用的注解按照功能进行分类

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

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

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

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

@Repository
public 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注解。不妨看代码:

@Component
public 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的工厂(类似于一个新的容器)。最简单的配合使用示例如下:

@Configuration
public 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注解后,表明该类会作为与前端作交互的控制层组件

@Controller
public class CompanyController {
/**this class will be the controller component of container**/
...
}

@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注解,如下例:

@Service
public 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 串行化(对资源消耗较大,一般不使用)

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

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

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

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

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

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

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

总结

以上就是本文关于浅谈spring 常用注解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅:

Java之Spring注解配置bean实例代码解析

浅谈Java注解和动态代理

有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

(0)

相关推荐

  • spring mvc常用注解_动力节点Java学院整理

    Spring从2.5版本开始在编程中引入注解,用户可以使用@RequestMapping, @RequestParam, @ModelAttribute等等这样类似的注解.到目前为止,Spring的版本虽然发生了很大的变化,但注解的特性却是一直延续下来,并不断扩展,让广大的开发人员的双手变的更轻松起来,这都离不开Annotation的强大作用,今天我们就一起来看看Spring MVC 4中常用的那些注解吧. 1. @Controller Controller控制器是通过服务接口定义的提供访问应用

  • 聊聊springmvc中controller的方法的参数注解方式

    绪论 相信接触过springmvc的同学都知道,在springmvc的控制层中,我们在方法的参数中可以使用注解标识.比如下面例子: public Map<String, Object> login(@PathVariable("loginParams") String loginParams) @PathVariable注解就标识了这个参数是作为一个请求地址模板变量的(不清楚的同学可以先学习一下restful设计风格).这些注解都是spring内置注解,那么 我们可不可以自

  • 详解SpringBoot 快速整合Mybatis(去XML化+注解进阶)

    序言:使用MyBatis3提供的注解可以逐步取代XML,例如使用@Select注解直接编写SQL完成数据查询,使用@SelectProvider高级注解还可以编写动态SQL,以应对复杂的业务需求. 一. 基础注解 MyBatis 主要提供了以下CRUD注解: @Select @Insert @Update @Delete 增删改查占据了绝大部分的业务操作,掌握这些基础注解的使用是很必要的.例如下面这段代码无需XML即可完成数据查询: @Mapper public interface UserMa

  • spring自定义注解实现拦截器的实现方法

    类似用户权限的需求,有些操作需要登录,有些操作不需要,可以使用过滤器filter,但在此使用过滤器比较死板,如果用的话,就必须在配置文件里加上所有方法,而且 不好使用通配符.这里可以采用一种比较简单灵活的方式,是采用spring 的 methodInterceptor拦截器完成的,并且是基于注解的.大概是用法是这样的: @LoginRequired @RequestMapping(value = "/comment") public void comment(HttpServletRe

  • 详解spring boot mybatis全注解化

    本文重点给大家介绍spring boot mybatis 注解化的实例代码,具体内容大家参考下本文: pom.xml <!-- 引入mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version

  • SpringBoot 注解事务声明式事务的方式

    springboot 对新人来说可能上手比springmvc要快,但是对于各位从springmvc转战到springboot的话,有些地方还需要适应下,尤其是xml配置.我个人是比较喜欢注解➕xml是因为看着方便,查找方便,清晰明了.但是xml完全可以使用注解代替,今天就扒一扒springboot中事务使用注解的玩法. springboot的事务也主要分为两大类,一是xml声明式事务,二是注解事务,注解事务也可以实现类似声明式事务的方法,关于注解声明式事务,目前网上搜索不到合适的资料,所以在这里

  • 浅谈spring 常用注解

    我们不妨先将spring常用的注解按照功能进行分类 1 .将普通类加入容器形成Bean的注解 日常开发中主要使用到的定义Bean的注解包括(XML方式配置bean暂不讨论): @Component.@Repository.@Service.@Controller.@Bean 其中@Component.@Repository.@Service.@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型.当一个组件代表数据访问层(Dao)时,你可以给它加上@Reposit

  • 浅谈Spring自定义注解从入门到精通

    在业务开发过程中我们会遇到形形色色的注解,但是框架自有的注解并不是总能满足复杂的业务需求,我们可以自定义注解来满足我们的需求.根据注解使用的位置,文章将分成字段注解.方法.类注解来介绍自定义注解 字段注解 字段注解一般是用于校验字段是否满足要求,hibernate-validate依赖就提供了很多校验注解 ,如@NotNull.@Range等,但是这些注解并不是能够满足所有业务场景的.比如我们希望传入的参数在指定的String集合中,那么已有的注解就不能满足需求了,需要自己实现. 自定义注解 定

  • 浅谈Spring中@Import注解的作用和使用

    @Import用来导入@Configuration注解的配置类.声明@Bean注解的bean方法.导入ImportSelector的实现类或导入ImportBeanDefinitionRegistrar的实现类. @Import注解的作用 查看Import注解源码 /** * Indicates one or more {@link Configuration @Configuration} classes to import. * * <p>Provides functionality eq

  • 浅谈Spring的两种事务定义方式

    一.声明式 这种方法不需要对原有的业务做任何修改,通过在XML文件中定义需要拦截方法的匹配即可完成配置,要求是,业务处理中的方法的命名要有规律,比如setXxx,xxxUpdate等等.详细配置如下: <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="

  • 浅谈Spring的两种配置容器

    Spring提供了两种容器类型 SpringIOC容器是一个IOC Service Provider.提供了两种容器类型:BeanFactory和ApplicationContext.Spring的IOC容器是一个提供IOC支持的轻量级容器.除了基本的ioc支持,它作为轻量级容器还提供了IOC之外的支持. BeanFactory BeanFactory是基础类型IOC容器.顾名思义,就是生产Bean的工厂.能够提供完整的IOC服务.没有特殊指定的话,其默认采用延迟初始化策略.只有当客户端对象需要

  • 浅谈spring中的default-lazy-init参数和lazy-init

    在spring的配置中的根节点上有个  default-lazy-init="true"配置: 1.spring的default-lazy-init参数 此参数表示延时加载,即在项目启动时不会实例化注解的bean,除非启动项目时需要用到,未实例化的注解对象在程序实际访问调用时才注入调用 spring在启动的时候,default-lazy-init参数默认为false,会默认加载整个对象实例图,从初始化ACTION配置.到 service配置到dao配置.乃至到数据库连接.事务等等.这样

  • 浅谈spring ioc的注入方式及注入不同的数据类型

    关于Spring-IoC的简单使用参考: spring ioc的简单实例及bean的作用域属性解析 1.通过set方法注入不同数据类型 测试类代码(set方式注入的属性一定要加set方法) /**通过set方法注入示例*/ public class IoC_By_Set { /**注入Integer类型参数*/ private Integer id; /**注入String类型参数*/ private String name; /**注入实体Bean*/ private User user; /

  • 浅谈spring security入门

    一 介绍 本节给知识追寻者给大家带来的是springSecurity入门篇,主要是简述下springSecrurity的启动原理和简单的入门搭建: 二 核心模块介绍 spring-security-core : 包含核心身份验证和access-contol类和接口,远程支持和基本配置AP: spring-security-web: web , url登陆验证和访问控制: spring-security-config: 支持xml 或者java注解配置: 当然其模块远不止这些,比如CAS,ALC,

  • 浅谈Spring 的Controller 是单例or多例

    背景:今天写代码遇到一个Controller 中的线程安全问题,那么Spring 的Controller 是单例还是多例的呢?若为单例又如何保证并发安全呢? 一.面试回答 Spring管理的Controller,即加入@Controller 注入的类,默认是单例的,因此建议: 1.不要在Controller 中定义成员变量:(单例非线程安全,会导致属性重复使用) 2.若必须要在Controller 中定义一个非静态成员变量,则通过注解@Scope("prototype"),将其设置为多

  • 浅谈spring的重试机制无效@Retryable@EnableRetry

    spring-retry模块支持方法和类.接口.枚举级别的重试 方式很简单,引入pom包 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>lastest</version> </parent> <dependency> &

随机推荐

其他