一、定义Bean的注解:@Component、@Repository、@Service、@Controller、@Bean
@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。 如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。 这四个注释是用来修饰类的。
@Repository
当组件代表数据访问层(Dao)时使用@Repository
@Service
当组件用于业务层时使用@Service
@Controller
当组件属于控制层时使用@Controller
@Component
当组件不能很好地归类时使用@Component
例如:
-
@Service(value=
"SUService")
-
public
class SecUsersServiceImpl implements SecUsersService {
-
@Autowired
-
private SecUsersDao secUsersDao;
-
@Autowired
-
private SecRoleUserService secRoleUserService;
-
public void doBusiness(){
-
//do some business
-
}
-
}
Spring 如果不用SecUserService 或者value="SecUserService"这种写法的话,默认加载 Service 是以类名首字母小写的方式自动命名,而上面这种方式进行定义的话,那么 spring 加载时就不使用默认的命名方式,而使用设置的这个值作为名称。
@Bean
用在方法上,告诉Spring容器,你可以从下面这个方法中拿到一个Bean,并且交给Spring容器管理。
例如:
-
@Component
-
public
class FactoryMethodComponent {
-
-
@Bean
-
public TestBean publicInstance() {
-
return
new TestBean();
-
}
-
}
另:
@Bean注解经常与@Configuration注解一起使用。如果将一个类标注为@Configuration注解,那么也就意味着这个class将会作为创建各种bean的工厂。
代码一:
-
@Configuration
-
public
class AppConfig {
-
@Bean
-
public TransferService transferService() {
-
return
new TransferServiceImpl();
-
}
-
}
代码二:
-
<beans>
-
<bean name=
"transferService"
class=
"com.acme.TransferServiceImpl"/>
-
</beans>
如上所示,代码一和代码二作用相同。
二、使用Bean的注解:@Autowired、@Resource
@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
示例代码:
-
@Service
-
public
class DicManageService{
-
-
xxxxxxxxxxx;
-
-
}
-
-
@Controller
-
public
class DicManageController{
-
@Autowired
-
public DicManageService service;
-
service.xxxxx;
-
-
}
@Autowired
@Autowired,默认按类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合@Qualified注解进行限定,指定注入的bean名称,使用方式如下:
-
@Autowired()
@Qualifier(
"baseDao")
-
private BaseDao baseDao;
@Resource
@Resource,默认按名称装配,名称可以通过name属性进行指定。 如果没有指定name属性,当注解写在字段上时,默认取字段名按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
-
@Resource(name=
"baseDao")
-
private BaseDao baseDao;
三、Spring MVC常用注解: @Controller、@RequestMapping、@ResponseBody、@RestController、@RequestBody、@RequestParam、@PathVariable、@PropertySourc、@Import、@ImportResource
@RequestMapping
RequestMapping ,是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
示例代码:
-
@Controller
-
@RequestMapping(value=
"/example")
-
public
class HelloWorld {
-
@RequestMapping(value=
"/login")
-
public void login(User user, HttpServletResponse response){
-
response.getWriter.write(JSONObject.fromObject(user).toString());
-
}
-
}
其属性如下:
value:指定请求的实际地址,指定的地址可以是URI Template 模式;
method:指定请求的method类型, GET、POST、PUT、DELETE等;
consumes: 指定处理请求的提交内容类型(Content-Type),例如 application/json, text/html;
produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
params: 指定request中必须包含某些参数值是,才让该方法处理。
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求
示例代码:
-
@Controller
-
@RequestMapping(value=
"/example")
-
public
class HelloWorld {
-
@RequestMapping(value=
"/login",method = RequestMethod.GET)
-
public void login(User user, HttpServletResponse response){
-
response.getWriter.write(JSONObject.fromObject(user).toString());
-
}
-
}
@ResponseBody
@ResponseBody ,是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML。
代码一:
-
@Controller
-
@RequestMapping(value=
"/example")
-
public
class HelloWorld {
-
@RequestMapping(
"/login")
-
public void login(User user, HttpServletResponse response){
-
response.getWriter.write(JSONObject.fromObject(user).toString());
-
}
-
}
代码二:
-
@Controller
-
@RequestMapping(value=
"/example")
-
public
class HelloWorld {
-
@RequestMapping(
"/login")
-
@ResponseBody
-
public User login(User user){
-
return user;
-
}
-
}
如上所示,代码一和代码二作用相同,User字段:username pwd,那么在前台接收到的数据为:'{"username":"xxx","pwd":"xxx"}'
@RestController
@RestController = @Controller + @ResponseBody
通过新的@RestController指定在控制器上,这样就不需要在每个@RequestMapping方法上加 @ResponseBody了。
代码一:
-
@Controller
-
@RequestMapping(value=
"/example")
-
public
class HelloWorld {
-
@RequestMapping(
"/login")
-
@ResponseBody
-
public User login(User user){
-
return user;
-
}
-
}
-
代码二:
-
@RestController
-
@RequestMapping(value=
"/example")
-
public
class HelloWorld {
-
@RequestMapping(
"/login")
-
public User login(User user){
-
return user;
-
}
-
}
-
如上所示,代码一和代码二作用相同。
@RequestBody
@RequestBody通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,也可以将其分别绑定到对应的字符串上。
如果一个request请求的请求体包含 data:'{"userName":"admin","pwd","admin123"}'
-
@Controller
-
@RequestMapping(value=
"/example")
-
public
class HelloWorld {
-
@requestMapping(
"/login")
-
public void login(@requestBody String userName,@requestBody String pwd){
-
System.out.println(userName+
" ,"+pwd);
-
}
这种情况是将JSON字符串中的两个变量的值分别赋予了两个字符串,如果有一个User类,拥有如下字段:String userName; String pwd; 那么上述参数可以改为以下形式:@requestBody User user 这种形式会将JSON字符串中的值赋予user中对应的属性上。
需要注意的是,JSON字符串中的key必须对应user中的属性名,否则是请求不过去的。
@RequestParam
@RequestParam ,用于绑定request请求参数到指定的方法。
-
@RestController
-
@RequestMapping(value=
"/example")
-
public
class HelloWorld {
-
-
@RequestMapping(
"/helloworld")
-
public String hello(@RequestParam(value = "data", required = false) String data){
-
System.out.println(data);
-
return
"success";
-
}
-
}
value = "data":提取名为“data”的String类型的参数,并将之作为输入参数传入。
required = false:是否必须传的字段(默认情况下,required=true)
另:
类型转换目前支持所有的基本Java类型
@RequestParam(value="data", required=false) String number
@RequestParam("id") Long id
@RequestParam("balance") double balance
@PathVariable
@PathVariable ,该注解用于修饰方法参数,用来获得请求url中的动态参数。
Object result = restTemplate.getForObject(“http://应用名/example/helloword/张三”,String.class)
-
@RestController
-
@RequestMapping(value=
"/example")
-
public
class HelloWorld {
-
-
@RequestMapping(
"/helloworld/{username}")
-
public String hello(@PathVariable("username") String username){
-
System.out.println(
"用户姓名为: " +username);
-
return
"success";
-
}
-
}
-
-
输出:用户姓名为:张三
当我们请求 “/example/helloword/张三”时,username会动态地绑定为“张三”。
@PropertySource
@PropertySource ,注解可以从properties文件中,获取对应的key-value值,将其赋予变量。
首先有一个config.properties文件内容如下:
demo.url = 1.2.3.4
demo.db = helloTest
-
@Configuration
-
@PropertySource(
"classpath:config.properties")
-
public
class AppConfigMongoDB {
-
-
@Value(
"${demo.url}")
-
private String mongodbUrl;
-
-
@Value(
"${demo.db}")
-
private String defaultDb;
-
}
增加在另一类中引入 AppConfigMongoDB 的方式,@Autowired 经典用法, 在Spring环境下,注入properties值得的方式,通过@PropertySource指明properties文件位置,通过@Value注入。在Spring Boot里,我们只需要在application.properties定义属性,直接使用@Value注入即可。
@Import、@ImportResource
@Import、@ImportResource用来进行资源文件的读取。
@Import,Java配置文件中引入Java配置文件。
@ImportResource,Java配置文件中引入xml配置文件。
-
@Configuration
-
@Import(AppConfig.class)
-
@ImportResource(
"classpath:cd-config.xml")
-
public
class SoundSystemConfig {
-
-
}
四、事务模块注解:@Transactional
在处理dao层或service层的事务操作时,譬如删除失败时的回滚操作,可用到@Transactional注解
五、Spring AOP模块注解:@Aspect、@Pointcut、@Before、@Around、@After、 @AfterReturning、@AfterThrowing
@Aspect 标明该类为切面类,并启用AspectJ注解,注:在使用时要同@Component一起使用,否则不会被扫描到加入容器
@Pointcut 定义切入点,关于切入点表达式书写方式,请移步官方文档:spring AOP文档
@Around 定义环绕通知,在目标方法执行前后嵌入相关业务逻辑
@Before 定义前置通知,在目标方法执行前执行
@After 定义后置通知,在目标方法执行后执行,不论是目标方法执行正常后退出,还是抛出异常后退出,均会被执行
@AfterReturning 目标方法执行正常退出后执行
@AfterThrowing 目标方法执行抛出异常后执行
转载自: https://blog.csdn.net/tongtong_use/article/details/81098052