新人小白处女作——个人学习笔记,和各位大佬分享一下。希望能够帮助到一些微薄之处,也请各位读者观众们多多包涵,如有不足之处(错误,遗漏,更优的),敬请指正,给小编在“绝顶”聪明的路上添砖“JAVA”。
目录
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容器进行管理。
放在类上使用。