Spring常用注解

一: 组件类注解

1、@Repository

当一个组件代表数据访问层(DAO)的时候,我们使用@Repository进行注解,如下

 1 @Repository
 2 
 3 public class HappyDaoImpl implements HappyDao{
 4 
 5 private final static Logger LOGGER = LoggerFactory.getLogger(HappyDaoImpl .class);
 6 
 7 public void  club(){
 8 
 9         //do something ,like drinking and singing
10 
11     }
12 
13 }

 

2、@Service

当一个组件代表业务层时,我们使用@Service进行注解,如下

 1 @Service(value="goodClubService")
 2 
 3 //使用@Service注解不加value ,默认名称是clubService
 4 
 5 public class ClubServiceImpl implements ClubService {
 6 
 7     @Autowired
 8 
 9     private ClubDao clubDao;
10 
11   
12 
13     public void doHappy(){
14 
15         //do some Happy
16 
17     }
18 
19  }

 

3、@Controller

当一个组件作为前端交互的控制层,使用@Controller进行注解,如下

 1 @Controller
 2 
 3 public class HappyController {
 4 
 5 @Autowired //下面进行讲解
 6 
 7     private ClubService clubService;
 8 
 9     
10 
11 // Control the people entering the Club
12 
13 // do something
14 
15 }
16 
17 /*Controller相关的注解下面进行详细讲解,这里简单引入@Controller*/
18 
19  

 

总结:

指定了某些类可作为Spring Bean类使用后,最好还需要让spring搜索指定路径,在Spring配置文件加入如下配置:

<!-- 自动扫描指定包及其子包下的所有Bean类 -->

 1 <context:component-scan base-package="org.springframework.*"/> 

 

二:装配bean时常用的注解

1、@AutoWired

(1)自动装配,作用是为了消除Java代码里面的getter/setter与bean属性中的property。

(2)@Autowirred默认按类型匹配的方式,在容器查找匹配的Bean,当且仅有一个匹配的Bean时,Spring将其注入@AutoWired标注的变量中。

(3)如果找不到bean,@Autowired注解的required属性设置为false即可:这样Spring容器就不会抛出异常,而是显示null。

 1 @Controller
 2 
 3 public class HappyController {
 4 
 5 @Autowired //默认依赖的ClubDao 对象(Bean)必须存在
 6 
 7 //@Autowired(required = false) 改变默认方式
 8 
 9 @Qualifier("goodClubService")
10 
11     private ClubService clubService;
12 
13     
14 
15 // Control the people entering the Club
16 
17 // do something
18 
19 }

 

2、@Qualifier(指定注入Bean的名称)

当匹配到的bean不止一个的时候,我们需要使用@Qualifier注解来指定Bean的名称:

 1 package com.spring.model;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 
 5 import org.springframework.beans.factory.annotation.Qualifier;
 6 
 7 import com.spring.service.ICar;
 8 
 9 public class CarFactory {  
10 
11     @Autowired
12 
13     @Qualifier("bmwCar")
14 
15     private ICar car;
16 
17     public String toString(){
18 
19         return car.getCarName();
20 
21     }  
22 
23 }

 

 

3、@Resource

这个不是Spring的注解,用法和@Autowired类似

 1 public class AnotationExp {
 2 
 3  
 4 
 5     @Resource(name = "HappyClient")
 6 
 7     private HappyClient happyClient;
 8 
 9     
10 
11     @Resource(type = HappyPlayAno .class)
12 
13     private HappyPlayAno happyPlayAno;
14 
15 }

 

 

4、区分一下@Autowired和@Resource两个注解的区别:

(1)、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配

(2)、@Autowired是Spring的注解,@Resource是J2EE的注解

 

总结

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

<context:component-scan> 

 

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

则一定要配置 annotation-config

<context:annotation-config/>

 

 

 

三:@Component vs @Configuration and @Bean

1、简单介绍

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

@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 {

    @Bean

    public MyService myService() {

        return new MyServiceImpl();

    }

}

 

这和 Spring 的 XML 文件中的非常类似

 

<beans>

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

</beans>

 

@Bean 注解扮演了和元素相同的角色。

 

2、举例说明@Component 和 @Configuration

@Configuration

public static class Config {

 

    @Bean

    public SimpleBean simpleBean() {

        return new SimpleBean();

    }

 

    @Bean

    public SimpleBeanConsumer simpleBeanConsumer() {

        return new SimpleBeanConsumer(simpleBean());

    }

}

 

@Component

public static class Config {

 

    @Bean

    public SimpleBean simpleBean() {

        return new SimpleBean();

    }

 

    @Bean

    public SimpleBeanConsumer simpleBeanConsumer() {

        return new SimpleBeanConsumer(simpleBean());

    }

 

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

 

3、原因总结

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

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

 

@Component

public static class Config {

    @Autowired

    SimpleBean simpleBean;

 

    @Bean

    public SimpleBean simpleBean() {

        return new SimpleBean();

    }

 

    @Bean

    public SimpleBeanConsumer simpleBeanConsumer() {

        return new SimpleBeanConsumer(simpleBean);

    }

}

 

四:spring MVC模块注解

1、@Controller :

表明该类会作为与前端作交互的控制层组件,通过服务接口定义的提供访问应用程序的一种行为,解释用户的输入,将其转换成一个模型然后将试图呈献给用户。

1 @Controller
2 
3 public class HappyController {
4 
5 //do something
6 
7 ...
8 
9 }

 

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

 

2、@RequestMapping : 

这个注解用于将url映射到整个处理类或者特定的处理请求的方法。可以只用通配符!

 1 @Controller
 2 
 3 @RequestMapping("/happy")
 4 
 5 public class HappyController  {
 6 
 7  
 8 
 9   @Autowired
10 
11   private HappyService happyService;
12 
13   
14 
15   @RequestMapping(/hello/*)
16 
17   public void sayHello(){
18 
19 //请求为 /happy/hello/* 都会进入这个方法!
20 
21 //例如:/happy/hello/123   /happy/hello/adb
22 
23 //可以通过get/post 请求
24 
25   }
26 
27   @RequestMapping(value="/haha",method=RequestMethod.GET)
28 
29   public void sayHaHa(){
30 
31   //只能通过get请求
32 
33   }
34 
35 ...
36 
37 }

 

 

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

 

3、@RequestParam :

将请求的参数绑定到方法中的参数上,有required参数,默认情况下,required=true,也就是改参数必须要传。如果改参数可以传可不传,可以配置required=false。

 1  @RequestMapping("/happy")
 2 
 3   public String sayHappy(
 4 
 5   @RequestParam(value = "name", required = false) String name,
 6 
 7   @RequestParam(value = "age", required = true) String age) {
 8 
 9   //age参数必须传 ,name可传可不传
10 
11   ...
12 
13   }

 

 

4、@PathVariable :

该注解用于方法修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定)。

1 @RequestMapping(value="/happy/{dayid}",method=RequestMethod.GET)
2 
3 public String findPet(@PathVariable String dayid, Model mode) {
4 
5 //使用@PathVariable注解绑定 {dayid} 到String dayid
6 
7 }

 

 

@PathVariable中的参数可以是任意的简单类型,如int, long, Date等等。Spring会自动将其转换成合适的类型或者抛出 TypeMismatchException异常。当然,我们也可以注册支持额外的数据类型。

@PathVariable支持使用正则表达式,这就决定了它的超强大属性,它能在路径模板中使用占位符,可以设定特定的前缀匹配,后缀匹配等自定义格式。

 

5、@RequestBody : 

@RequestBody是指方法参数应该被绑定到HTTP请求Body上。

1 @RequestMapping(value = "/something", method = RequestMethod.PUT)
2 
3 public void handle(@RequestBody String body,@RequestBody User user){
4 
5    //可以绑定自定义的对象类型
6 
7 }

 

 

6、@ResponseBody : 

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

 1 @ResponseBody在输出JSON格式的数据时,会经常用到。
 2 
 3 @RequestMapping(value = "/happy", method =RequestMethod.POST)
 4 
 5 @ResponseBody
 6 
 7 public String helloWorld() {    
 8 
 9 return "Hello World";//返回String类型
10 
11 }

 

 

7、@RestController :

控制器实现了REST的API,只为服务于JSON,XML或其它自定义的类型内容,@RestController用来创建REST类型的控制器,与@Controller类型。@RestController就是这样一种类型,它避免了你重复的写@RequestMapping与@ResponseBody。

 

8、@ModelAttribute :

@ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。

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

 

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

 

 

五:Spring事务模块注解

1、常用到的注解

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

<!-- 开启注解方式声明事务 -->

     1 <tx:annotation-driven transaction-manager="transactionManager" /> 

 

2、举例

 1 @Service
 2 
 3 public class CompanyServiceImpl implements CompanyService {
 4 
 5   @Autowired
 6 
 7   private CompanyDAO companyDAO;
 8 
 9 
10 
11   @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
12 
13   public int deleteByName(String name) {
14 
15 
16 
17     int result = companyDAO.deleteByName(name);
18 
19     return result;
20 
21   }
22 
23   ...
24 
25 }

 

posted @ 2019-06-30 22:33  乌鱼#  阅读(544)  评论(0编辑  收藏  举报