Spring 中使用注解需要先添加配置文件,告知spring框架,在读取配置文件,创建容器时扫描包,依据注解创建对象,并存入容器中
(1)、以下四个注解的作用及属性都是一模一样的,都是针对一个的衍生注解只不过是提供了更加明确的语义化。
作用:
都是把资源交给spring来管理,相当于:
;
属性:
value:指定bean的id;如果不指定value属性,默认bean的id是当前类的类名,首字母小写;
一般用于表现层。
一般用于业务层。
一般用于持久层。
通用,通常用于三层架构之外。
作用:
指定bean的作用域范围。
属性:
value:指定范围的值,singleton prototype request session。
以下四个注解的作用相当于:
。
作用:
自动按照类型注入。set方法可以省略
作用:
自动按照名字注入。set方法可以省略。
属性:
name:指定bean的id。
作用:
注入基本数据类型和String类型数据的
属性:
value:用于指定值
li在Spring项目中要先进行配置,开启spring对注解AOP的支持
@Aspect:把当前类声明为切面类
@Before:前置通知,可以指定切入点表达式
@AfterReturning:后置【try】通知,可以指定切入点表达式
@AfterThrowing:异常【catch】通知,可以指定切入点表达式
@After:最终【finally】通知,可以指定切入点表达式
@Around:环绕通知,可以指定切入点表达式
作用:用于建立请求URL和处理请求方法之间的对应关系。
出现位置:
类上:
请求 URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以按照模块化管理,例如:
账户模块:
/account/add
/account/update
/account/delete ...
订单模块:
/order/add
/order/update
/order/delete
红色的部分就是把RequsetMappding写在类上,使我们的URL更加精细。
方法上:
请求URL的第二级访问目录,可以窄化请求路径
属性:
value:用于指定请求的URL。它和path属性的作用是一样的。
method:用于指定请求的方式。
注意:以上属性只要出现2个或以上时,他们的关系是与的关系。
窄化路径案例:
@Controller
@RequestMapping("@Controller
@RequestMapping("/account")//一级路径
public class AccountController {
//指定的请求方式
@RequestMapping(value = "/findAccount1", method = RequestMethod.POST)//二级路径
public ModelAndView findAccount1() {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "欢迎你 springmvc");
mv.setViewName("success");
return mv;
}
}")
public class AccountController {
//指定的请求方式
@RequestMapping(value = "/findAccount1", method = RequestMethod.POST)
public ModelAndView findAccount1() {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "欢迎你 springmvc");
mv.setViewName("success");
return mv;
}
}
同RequestMapping差不多相同,将它添加到控制器方法上,并指定所需的URL路径即可
只可将 HTTP Get 请求映射到指定的处理方法上。
同RequestMapping差不多相同,将它添加到控制器方法上,并指定所需的URL路径即可
只可将 HTTP PUT 请求映射到指定的处理方法上。
映射 URL 绑定的占位符
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx”) 绑定到操作方法的入参中。
(1)、若方法参数名称和需要绑定的url中变量名称一致时,可以简写:
@RequestMapping("/getUser/{name}")
public User getUser(@PathVariable String name){
return userService.selectUser(name);
}
(2)、若方法参数名称和需要绑定的url中变量名称不一致时,写成:
@RequestMapping("/getUserById/{name}")
public User getUser(@PathVariable("name") String userName){
return userService.selectUser(userName);
}
作用:接收前端ajax传递给后端的json字符串,并将json格式的数据转为java对象。
作用:将java对象转为json格式的数据传递给前台ajax。
作用:用于指定当前类是一个spring配置类,可替换xml配置文件,作用和在spring的xml配置文件中的:
是一样的。当从一个类上加载到该注解时会创建spring容器。
作用:用于指定spring在初始化容器时要扫描的包。作用和在spring的xml配置文件中的:
是一样的。
属性:basePackages:用于指定要扫描的包。和该注解中的value属性作用一样。
例:
/**
* spring的配置类
*/
@Configuration
@ComponentScan(basePackages = "com.by")//等价于
public class SpringConfiguration{
}
作用:该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器。作用和在spring的xml配置文件中的:
是一样的。
属性:
name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)。
作用:
用于加载*.properties文件中的配置。作用和在spring的xml配置文件中的:
是一样的。
属性:
value[]:用于指定properties文件位置。如果是在类路径下,需要写上classpath:
例:
#config.properties
nam=二狗
age=18
@PropertySource("classpath:config.properties")
public class SpringConfiguration {
@Value("${nam}")
private String nam;
@Value("${age}")
private Integer age;
@Bean
public Dog dog(){
Dog dog = new Dog();
dog.setNam(nam);
dog.setAge(age);
return dog;
}
}
作用:@Import注解是用来导入配置类或者一些需要前置加载的类。作用和在spring的xml配置文件中的:
是一样.
属性:
value[]:用于指定其他配置类的字节码(.class)。
用来声明一些全局性的东西,最常见的是结合@ExceptionHandler注解用于全局异常的处理。
可以用来统一处理方法抛出的异常,当我们使用这个@ExceptionHandler注解时,我们需要定义一个异常的处理方法,比如下面的handleExeption2()方法,给这个方法加上@ExceptionHandler注解,这个方法就会处理类中其他方法(被@RequestMapping注解的)抛出的异常。
@ExceptionHandler()
public String handleExeption2(Exception ex) {
System.out.println("抛异常了:" + ex);
ex.printStackTrace();
String resultStr = "异常:默认";
return resultStr;
}
(1)@ExceptionHandler注解中可以添加参数,参数是某个异常类的class,代表这个方法专门处理该类异常,例:
@ExceptionHandler(NumberFormatException.class)
public String handleExeption(Exception ex) {
System.out.println("抛异常了:" + ex);
ex.printStackTrace();
String resultStr = "异常:NumberFormatException";
return resultStr;
}
标识该类是一个启动器类
是一个运行器
例:@RunWith(SpringJUnit4ClassRunner.class)
让junit与spring环境进行整合,让测试运行于Spring 环境
整合JUnit4测试时,使用注解引入多个配置文件,当一个类添加了注解@Component,那么他就自动变成了一个bean,就不需要再Spring配置文件中显示的配置了。把这些bean收集起来通常有两种方式,Java的方式和XML的方式。当这些bean收集起来之后,当我们想要在某个测试类使用@Autowired注解来引入这些收集起来的bean时,只需要给这个测试类添加@ContextConfiguration注解来标注我们想要导入这个测试类的某些bean。
例:
1、单个文件
@ContextConfiguration(Locations="../applicationContext.xml")
@ContextConfiguration(classes = SimpleConfiguration.class)
2、多个文件时,可用{}
@ContextConfiguration(locations = { "classpath*:/spring1.xml", "classpath*:/spring2.xml" })
3、扫描所有
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:/*.xml"})
public class CDPlayerTest {
}
@ContextConfiguration括号里的locations = {"classpath*:/*.xml"}就表示将class路径里的所有.xml文件都包括进来,那么刚刚创建的那么XML文件就会包括进来,那么里面自动扫描的bean就都可以拿到了,此时就可以在测试类中使用@Autowired注解来获取之前自动扫描包下的所有bean
classpath和classpath*区别:
classpath:只会到你的class路径中查找找文件。
classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找。
用户扫描MyBatis的Mapper接口
例:
@SpringBootApplication
@MapperScan("com.by.mapper") // @MapperScan 用户扫描MyBatis的Mapper接口
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
声明事务管理,用在接口实现类或接口实现方法上,当调用一个用@Transactional注解的方法时,Spring Boot使用TransactionManager来创建一个新的事务或加入一个已有的事务。TransactionManager然后管理事务的生命周期,包括根据事务操作的成功或失败来提交或回滚事务。
@SpringBootTest(classes = 启动类名称.class)
使用SpringBoot 测试类可在不需要启动程序时,即可使用。当你运行你的测试方法时他会自己启动程序调用所需使用到的mapper,service接口,实现方法。故而可在测试类中像编写正常service方法一样编写代码。基本等同于启动了整个服务,此时便可以开始功能测试。
注:
1)如果注解@SpringBootTest(classes = 启动类名称.class)中配置了项目启动类,则该测试类可以放在test.java下任何包中
2)如果注解@SpringBootTest没有配置里面的参数classes = Application.class,则需要确保test.java下的测试类包与启动类所在的包一致,即在test.java下也需要创建com.xunan.demo包,并将测试类放在该包下。