SSM框架常见注解的作用整合

新人小白处女作——个人学习笔记,和各位大佬分享一下。希望能够帮助到一些微薄之处,也请各位读者观众们多多包涵,如有不足之处(错误,遗漏,更优的),敬请指正,给小编在“绝顶”聪明的路上添砖“JAVA”。


目录

SSM框架注解整合

Spring框架注解:

@Autowired注解——自动装配注解(根据属性类型进行自动装配)1.@Autowired        注解构造器、普通字段(即使是非public)、一切具有参数的方法(setXX或其他方法)都可以应用。默认情况下,所有使用@Autowired注解的属性都需要被设置。参与自动装配的组件(需要装配别人、被别人装配)全部都必须在IOC容器中。

完全注解开发:

Spring整合Junit4

声明面向切面编程

声明式事务

@Nullable注解

junit注解

SpringMvc框架注解

@RequestMapping

@PathVariable注解

@RequestParam注解

@RequestHeader

@CookieValue

@RequestBody

@ResponseBody

@RestController注解

@ControllerAdvice

Mybatis框架注解

lombok注解

@Param

①Mapper接口中抽象方法的声明

②SQL语句



SSM框架注解整合

Spring框架注解:

/*(1) @Component	标识一个受Spring IOC容器管理的普通组件
*/    
@Component
public class TestComponent {}

/*(2) @Controller   标识一个受Spring IOC容器管理的表述层控制器组件
在三层架构中表述层里面使用的控制器
*/
@Controller
public class TestController {}

/*(3) @Service	  标识一个受Spring IOC容器管理的业务逻辑层组件
在三层架构中使用的业务逻辑组件
*/
@Service
public class TestService {}
    
/*(4) @Repository   标识一个受Spring IOC容器管理的持久化层组件
整合了Mybatis,这里就变成了Mapper接口,而Mapper接口是由Mybatis和Spring的整合包负责扫描的
*/
@Repository
public class TestDao {}
//方便用于组建扫描该包的注明了这些注解的类,然后创建IOC对象
<!-- 配置自动扫描的包 -->
<!-- 最基本的扫描方式 -->
<context:component-scan base-package="com.study.spring.component"/>

<!----------------------------------分割线------------------------------------>

 从IOC容器里面获取bean对象:

@Test
public void testBean() {
    TestComponent testComponent = iocContainer.getBean(TestComponent .class);
    
    TestController testController = iocContainer.getBean(TestController .class);
    
    TestService testService = iocContainer.getBean(TestService .class);
    
    TestDao testDao = iocContainer.getBean(TestDao .class);
    
    log.debug("testComponent = " + testComponent );
    log.debug("testController = " + testController );
    log.debug("testService = " + testService );
    log.debug("testDao = " + testDao );
}

注:四个注解没有本职区别,对于Spring使用IOC容器管理这些组件来说没有区别,也就是我可以在控制层使用@service注解,在持久化层使用@Controller注解。所以@Controller、@Service、@Repository这三个注解只是给开发人员看的,让我们能够便于分辨不同组件的作用。

@Autowired注解——自动装配注解(根据属性类型进行自动装配)
1.@Autowired        注解构造器、普通字段(即使是非public)、一切具有参数的方法(setXX或其他方法)都可以应用。默认情况下,所有使用@Autowired注解的属性都需要被设置。参与自动装配的组件(需要装配别人、被别人装配)全部都必须在IOC容器中。

当Spring找不到匹配的bean装配属性时,会抛出异常。

若某一属性允许不被设置,可以设置@Autowired注解的required属性为false.表示能装就装,但一般都是必须要安装的,用不着这个属性。

2.@Resource注解(了解) **根据名称进行注入

3.@Inject注解(了解)**可以根据类型注入,也可以根据名称注入

4.@Value注解**  注入普通类型属性

@Controller
public class TestController {

	@Autowired
	private TestService testService;
}

 @Autowired(自动装配流程)

  • 首先根据所需要的组件类型到 IOC 容器中查找

    • 能够找到唯一的 bean:直接执行装配

    • 如果完全找不到匹配这个类型的 bean:装配失败

    • 和所需类型匹配的 bean 不止一个

      • 没有 @Qualifier 注解:根据 @Autowired 标记位置成员变量的变量名作为 bean 的 id 进行匹配

        • 能够找到:执行装配

        • 找不到:装配失败

      • 使用 @Qualifier 注解:根据 @Qualifier 注解中指定的名称作为 bean 的id进行匹配

        • 能够找到:执行装配

        • 找不到:装配失败

完全注解开发:

1. @Configuration  使用 @Configuration 注解将一个普通的类标记为 Spring 的配置类,用来代替xml配置文件

2. @ComponentScan  在配置类中配置要扫描的包
3. @Bean注解相当于 XML 配置文件中的 bean 标签
   @Bean 注解标记的方法的返回值会被放入 IOC 容器
   默认以方法名作为 bean 的 id

package com.study;  
  
@Configuration
@ComponentScan("com.study")
public class SunConfiguration {
     // @Bean 注解相当于 XML 配置文件中的 bean 标签
    // @Bean 注解标记的方法的返回值会被放入 IOC 容器
    // 默认以方法名作为 bean 的 id

    @Bean
    pubilc TestComponent testComponent01(){
        
         TestComponent testComponent = new testComponent();
         
        testComponent.setComponentName("created by annotation config");

        return testComponent ;
        
    }
}

Spring整合Junit4

  • 好处1:不需要自己创建IOC容器对象了

  • 好处2:任何需要的bean都可以在测试类中直接享受自动装配

@ContextConfiguration

//指定Spring的配置文件的路径

@RunWith

//指定Spring为Junit4版本提供的运行器
    
@RunWith(SpringJUnit4ClassRunner.class)//指定单元测试框架
@ContextConfiguration("classpath:bean1.xml")//加载配置文件
public class springJunit4 {
    
}

声明面向切面编程

@Component
@Aspect
在Spring中声明切面使用@Aspect注解,而且切面也需要交给IOC容器管理,即切面上也需要添加@Component注解。
    

//切面编程的通知注解
①@Before:前置通知,在目标方法执行之前执行
②@After:  后置通知,在目标方法执行之后执行,不管方法是否发生异常,例如finally中的部分。
③@AfterReturning:返回通知,在方法执行成功,返回结果之后执行
④@AfterThrowing:异常通知,在方法执行失败,抛出异常之后执行
@Around:环绕通知,围绕着目标方法执行,相当于动态代理的全过程,可以替代前四种通知
   
    
@Pointcut //抽取相同的表达式
1.在AspectJ切面中,可以通过@Pointcut注解将一个切入点声明成简单的方法,切入点的方法体通常是空的。
2.其他通知可以通过方法名称引入该切入点
3.切入点方法的访问控制符同时也控制着这个切入点的可见性。
如果切入点要在多个切面中共用,最好将它们集中在一个公共的类中。
在这种情况下,它们必须被声明为public。
在引入这个切入点时,必须将类名也包括在内。
如果类没有与这个切面放在同一个包中,还必须包含包名。
// @Aspect表示这个类是一个切面类
@Aspect
// @Component注解保证这个切面类能够放入IOC容器
@Component
@Slf4j
public class LogAspect {
    // @Before注解:声明当前方法是前置通知方法
    // value属性:指定切入点表达式,由切入点表达式控制当前通知方法要作用在哪一个目标方法上
    @Before(value = "execution(public int com.spring.aop.api.Calculator.add(int,int))")
    public void printLogBeforeCore() {
        log.debug("[AOP前置通知] 方法开始了");
    }
    
    @AfterReturning(value = "execution(public int com.spring.aop.api.Calculator.add(int,int))")
    public void printLogAfterSuccess() {
        log.debug("[AOP返回通知] 方法成功返回了");
    }
    
    @AfterThrowing(value = "execution(public int com.spring.aop.api.Calculator.add(int,int))")
    public void printLogAfterException() {
        log.debug("[AOP异常通知] 方法抛异常了");
    }
    
    @After(value = "execution(public int com.spring.aop.api.Calculator.add(int,int))")
    public void printLogFinallyEnd() {
        log.debug("[AOP后置通知] 方法最终结束了");
    }
    
}

声明式事务

//开启事务操作
@Transactional
//可以加在类上面或者方法上

//如果把这个注解添加类上面,这个类里面所有的方法都添加事务
//如果把这个注解添加方法上面,为这个方法添加事务

//在 service 类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数
//propagation(事务传播行为):多事务方法直接进行调用,这个过程中事务 是如何进行管理的

propagation(事务传播行为)
@Transactional(propagation = Propagation.REQUIRED)	
    								REQUIRED_NEW	
ioslation(事务隔离级别)
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)

@Nullable注解

@Nullable 注解可以使用在方法上面,属性上面,参数前面,表示方法返回可以为空,属性值可以为空,参数值可以为空。此注解通常用来消除NullPointerException.

**\1) 注解用在方法上面,方法返回值可以为空**


**\2) 注解用在属性上面,属性可以为空**



**\3) 注解用在参数前面,参数可以为空**

junit注解

@Test
测试这部分程序的功能是否能正确实现?如出现bug,可以实时修改,完成这个模块的功能实现再去进行下一部分,最后将不同功能模块之间衔接起来。
想知道具体的效果,肯定是得跑(运行)一次才能知道,如果只在主方法main里面运行的话,每一次都要把前面的功能也跑一次,运行速度变慢,那么就可以通过@Test这个注解,单独运行类下的某个方法去完成实现效果。

public class sayHello {

    @Test
    public void testSayHello(){
        System.out.println("Hello word");
    }
}

SpringMvc框架注解

@RequestMapping

@RequestMapping
// @RequestMapping注解:处理请求和控制器方法之间的映射关系
// @RequestMapping注解的value属性可以通过请求地址匹配请求,/表示的当前工程的上下文路径
@RequestMapping(value)//只用value属性表示时,可以不用写value

@RequestMapping注解的value属性
@RequestMapping(value = {"/testRequestMapping", "/test"})
/*---------------------------分割线-----------------------------------------*/   
@RequestMapping注解的method属性,@RequestMapping注解的method属性通过请求的请求方式(get或post)匹配请求映射
@RequestMapping(
value = {"/testRequestMapping", "/test"},
method = {RequestMethod.GET, RequestMethod.POST})
/*---------------------------分割线-----------------------------------------*/
@RequestMapping注解的params属性
"param":要求请求映射所匹配的请求必须携带param请求参数

"!param":要求请求映射所匹配的请求必须不能携带param请求参数

"param=value":要求请求映射所匹配的请求必须携带param请求参数且param=value

"param!=value":要求请求映射所匹配的请求必须携带param请求参数但是param!=value
/*---------------------------分割线-----------------------------------------*/
@RequestMapping注解的headers属性
@RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射
"header":要求请求映射所匹配的请求必须携带header请求头信息

"!header":要求请求映射所匹配的请求必须不能携带header请求头信息

"header=value":要求请求映射所匹配的请求必须携带header请求头信息且header=value

"header!=value":要求请求映射所匹配的请求必须携带header请求头信息且header!=value

若当前请求满足@RequestMapping注解的value和method属性,但是不满足headers属性,此时页面显示404错误,即资源未找到    
/*---------------------------分割线-----------------------------------------*/
//  ant风格的路径
?:表示任意的单个字符

*:表示任意的0个或多个字符

\**:表示任意的一层或多层目录

注意:在使用\**时,只能使用/**/xxx的方式,
**前后不能有任何字符。
 //    @RequestMapping("/testAnt/?/ant")
//    @RequestMapping("/testAnt/*/ant")
    @RequestMapping("/testAnt/**/ant")
    public String testAnt(){
        System.out.println("测试Ant风格的URL");
        return "success";
}
/*---------------------------分割线-----------------------------------------*/
SpringMVC支持路径中的占位符
@RequestMapping("/testRest/{id}/{username}")
public String testRest(@PathVariable("id") String id, @PathVariable("username") String username){
    System.out.println("id:"+id+",username:"+username);
    return "success";
}
//最终输出的内容为-->id:1,username:admin
/*---------------------------分割线-----------------------------------------*/
<a th:href="@{/testRest/1/admin}">测试路径中的占位符-->/testRest</a><br>

@PathVariable注解

SpringMVC路径中的占位符常用于RESTful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参

@RequestMapping("/testRest/{id}/{username}")
public String testRest(@PathVariable("id") String id, @PathVariable("username") String username){
    System.out.println("id:"+id+",username:"+username);
    return "success";
}
//最终输出的内容为-->id:1,username:admin
/*---------------------------分割线-----------------------------------------*/
<a th:href="@{/testRest/1/admin}">测试路径中的占位符-->/testRest</a><br>

@RequestParam注解

@RequestParam是将请求参数和控制器方法的形参创建映射关系

@RequestParam注解一共有三个属性:

value:指定为形参赋值的请求参数的参数名

required:设置是否必须传输此请求参数,默认值为true

若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue属性,则页面报错400:Required String parameter 'xxx' is not present;若设置为false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为null

defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为""时,则使用默认值为形参赋值

@RequestMapping("/testParam")
public String testParam(
    @RequestParam("user_name") string username, 
    String password,
    string[] hobby){
    System.out.println("username:"+username+",password:"+password + ",hobby:" + Arrays.tostring(hobby));
    return "success";
}
<form th:action="@{/testParam}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    爱好:<input type="checkbox" name="hobby" value="a">a
    <input type="checkbox" name="hobby" value="b">b
    <input type="checkbox" name="hobby" value="c">c<br>
    <input type="submit" value="测试">
</form>

@RequestHeader

@RequestHeader是将请求头信息和控制器方法的形参创建映射关系

@RequestHeader注解一共有三个属性:value、required、defaultValue,用法同@RequestParam

a) value/name属性:用来设置请求头中的属性名。

b) required属性:用来设置该请求头中的属性是否是必须的,默认是true。

c) defaultValue属性:用来设置一个默认值,如果请求头中没有该属性将使用此值。

用法同@RequestParam

@CookieValue

@CookieValue是将cookie数据和控制器方法的形参创建映射关系

@CookieValue注解一共有三个属性:value、required、defaultValue,用法同@RequestParam

a) value/name属性:用来设置请求头Cookie对象的名字。

b) required属性:用来设置请求头中Cookie对象的名字是否是必须的,默认是true。

c) defaultValue属性:用来设置一个默认值,如果请求头中没有该Cookie对象的名字将使用此值。

用法同@RequestParam

@RequestBody

适用 @RequestBody 注解的场景:请求体整个是一个 JSON 数据

@RequestBody可以获取请求体,需要在控制器方法设置一个形参,使用@RequestBody进行标识,当前请求的请求体就会为当前注解所标识的形参赋值

@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String requestBody){
    System.out.println("requestBody:"+requestBody);
    return "success";
}
<form th:action="@{/testRequestBody}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit">
</form>

@ResponseBody

@ResponseBody用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体响应到浏览器

@RequestMapping("/testResponseBody")
@ResponseBody
public String testResponseBody(){
    return "success";
}

结果:浏览器页面显示success

@RestController注解

@RestController注解是springMVC提供的一个复合注解,标识在控制器的类上,就相当于为类添加了@Controller注解,并且为其中的每个方法添加了@ResponseBody注解

@ControllerAdvice

//@ControllerAdvice将当前类标识为异常处理的组件
@ControllerAdvice
public class ExceptionController {

    //@ExceptionHandler用于设置所标识方法处理的异常
    @ExceptionHandler(ArithmeticException.class)
    //ex表示当前请求处理中出现的异常对象
    public String handleArithmeticException(Exception ex, Model model){
        model.addAttribute("ex", ex);
        return "error";
    }
}

Mybatis框架注解

lombok注解

放置在类上面

注解和作用
@Data
生成getXxx()方法、setXxx()方法、toString()、equals()、canEqual()、hashCode()方法
@AllArgsConstructor
生成全参构造器
@NoArgsConstructor
生成无参构造器
@Slf4j
生成日志对象
@Getter
生成getXxx()方法
@Setter
生成setXxx()方法
@ToString
生成toString()方法

@Param

零散的多个简单类型参数,如果没有特殊处理,那么Mybatis无法识别自定义名称

①Mapper接口中抽象方法的声明

int updateEmployee(@Param("empId") Integer empId,@Param("empSalary") Double empSalary);

②SQL语句

<update id="updateEmployee">
  update t_emp set emp_salary=#{empSalary} where emp_id=#{empId}
</update>

@MapperScan

主要是扫描包目录下的Mapper,将Mapper接口类交给Spring容器进行管理。

放在类上使用。

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值