spring框架注解

1.注解类介绍

标准一个普通的spring Bean类。

  • @Service
    标注一个业务逻辑组件类。

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

这些都是注解在平时的开发过程中出镜率极高,@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。

2.举例详解

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

@Repository
public class HappyDaoImpl implements HappyDao{
private final static Logger LOGGER = LoggerFactory.getLogger(HappyDaoImpl .class);
public void  club(){
        //do something ,like drinking and singing
    }
}

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

@Service(value="goodClubService")
//使用@Service注解不加value ,默认名称是clubService
public class ClubServiceImpl implements ClubService {
    @Autowired
    private ClubDao clubDao;

    public void doHappy(){
        //do some Happy
    }
 }

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

@Controller
public class HappyController {
    @Autowired //下面进行讲解
    private ClubService clubService;

    // Control the people entering the Club
    // do something
}
/*Controller相关的注解下面进行详细讲解,这里简单引入@Controller*/

3、总结注意点

1、被注解的java类当做Bean实例,Bean实例的名称默认是Bean类的首字母小写,其他部分不变。@Service也可以自定义Bean名称,但是必须是唯一的!

2、尽量使用对应组件注解的类替换@Component注解,在spring未来的版本中,@Controller,@Service,@Repository会携带更多语义。并且便于开发和维护!

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

<!-- 自动扫描指定包及其子包下的所有Bean类 -->
<context:component-scan base-package="org.springframework.*"/>

4.spring MVC模块注解

1、web模块常用到的注解

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

@Controller
public class HappyController {
    //do something
...
}

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

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

@Controller
@RequestMapping("/happy")
public class HappyController  {

  @Autowired
  private HappyService happyService;

  @RequestMapping(/hello/*)
  public void sayHello(){
        //请求为 /happy/hello/* 都会进入这个方法!
        //例如:/happy/hello/123   /happy/hello/adb
        //可以通过get/post 请求
  }
  @RequestMapping(value="/haha",method=RequestMethod.GET)
  public void sayHaHa(){
  //只能通过get请求
  }
...
}

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

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

@RequestMapping("/happy")
 public String sayHappy(
 @RequestParam(value = "name", required = false) String name,
 @RequestParam(value = "age", required = true) String age) {
 //age参数必须传 ,name可传可不传
 ...
 }

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

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

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

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

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

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

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

@ResponseBody在输出JSON格式的数据时,会经常用到。


@RequestMapping(value = "/happy", method =RequestMethod.POST)
@ResponseBody
public String helloWorld() {    
return "Hello World";//返回String类型
}

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

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

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

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

  1. 注解在参数上。
    绑定请求参数到命令对象,并把命令对象添加到Model,用于视图页面展示。

@RequestMapping("/save")
public String save(@ModelAttribute(“bwf”) Company bwf) {
	service.save(bwf);
	return "result";
}

它的作用是将该绑定对象以“bwf”为key,添加Model对象中,供视图页面展示使用。页面中可以使用${bwf.name}来获取绑定对象的属性。

2. 注解在普通方法上(非RequestMapping注解的方法)。

@ModelAttribute("bwf")
public User addCompany(Company bwf) {
	return new Company("1","博为峰");
}

假设此方法是写在某个Controller内,那么执行该Controller内带有@RequestMapping注解的方法之前,都会先执行此addCompany方法,并且在model对象中将添加bwf对象。

3. 注解在@RequestMapping 方法返回值上。

绑定该方法的返回值到Model对象,用于视图页面展示时使用。@ModelAttribute 注解的返回值会覆盖

@RequestMapping 注解方法中的同名命令对象

5.Spring事务模块注解

1、常用到的注解

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

<!-- 开启注解方式声明事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

2.举例

@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 result;
  }
  ...
}

3、总结

事务的传播机制和隔离机制比较重要!

事务传播行为类型

说明

PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

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 串行化

(对资源消耗较大,一般不使用)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值