Spring注解
Spring注解 1 用于创建对象的注解; 他们的作用就和在XML配置文件中编写一个<bean>标签实现的功能是一样的; @Component: 作用:用于把当前类对象存入spring容器中; 属性: value:指定bean的id。当我们不写时,它的默认值是当前类名,且首字母改小写。 @Controller 一般用在表现层; @Service 一般用在业务层; @Repository 一般用在持久层; 以上三个注解的作用和属性与Component是一模一样; 以上三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰明了; 2 用于注入数据的注解 他们的作用就和在xml配置文件中的bean标签中写一个<property>标签的作用是一样的 @Autowired: 作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功 如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错。 如果Ioc容器中有多个类型匹配时: 出现位置: 可以是变量上,也可以是方法上 细节: 在使用注解注入时,set方法就不是必须的了。 @Qualifier: 作用:在按照类中注入的基础上再按照名称注入。它在给类成员注入时不能单独使用。在给方法参数注入时可以使用 属性: value:指定注入bean的id。 ....(@Qualifier("dataSource1") DataSource dataSource){} @Resource 作用:直接按照bean的id注入。它可以独立使用 属性: name:指定bean的id。 以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现。 另外,集合类型的注入只能通过XML来实现。 @Value 作用:注入基本类型和String类型的数据 属性: value:用于指定数据的值。它可以使用spring中SpEL(也就是spring的el表达式) SpEL的写法:${表达式} 3 用于改变作用范围的 他们的作用就和在bean标签中使用scope属性实现的功能是一样的 @Scope 作用:指定bean的作用范围 属性: value:指定范围的取值。常用取值:singleton(单例) prototype(多例) 4 和生命周期相关 了解 他们的作用就和在bean标签中使用init-method和destroy-methode的作用是一样的 @PreDestroy 作用:指定销毁方法 @PostConstruct 作用:指定初始化方法 5 用于指定配置的 @Configuration 作用:指定当前类是一个配置类 细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。 6 用于指定扫描包的 @ComponentScan 作用:用于通过注解指定spring在创建容器时要扫描的包 属性: value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。 我们使用此注解就等同于在xml中的配置: <context:component-scan base-package="com.test"></context:component-scan> @Bean 作用:把当前方法的返回值作为bean对象存入spring的ioc容器中 属性: name:指定bean的id。当不写时,默认值是当前方法的名称 细节: 当使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象。 查找的方式和Autowired注解的作用是一样的,自动按类型注入 7 导入其他配置类 @Import 作用:用于导入其他的配置类 属性: value:指定其他配置类的字节码; 当使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类; 8 用于指定读取配置文件的 @PropertySource 作用:指定properties文件的位置 属性: value:指定文件的名称和路径。 关键字:classpath,表示类路径下 9 测试类注解 使用Junit单元测试:测试当前的配置 Spring整合junit的配置 1、导入spring整合junit的jar(坐标) 2、使用Junit提供的一个注解把原有的main方法替换了,替换成spring提供的 @Runwith @RunWith(SpringJUnit4ClassRunner.class) 3、告知spring的运行器,spring和ioc创建是基于xml还是注解的,并且说明位置 @ContextConfiguration locations:指定xml文件的位置,加上classpath关键字,表示在类路径下 classes:指定注解类所在地位置 @ContextConfiguration(locations="classpath:testspringbean.xml") Spring MVC 注解 映射请求路径 @RequestMapping(path="") 作用:建立请求URL和处理方法之间得对应关系
1作用在类上,第一级得访问目录
2作用在方法上,第二季的访问目录
细节:路径可以不编写/表时应用的根目录开始
${pageContext.request.contextPath}也可以省略不写,但是路径上不能写/
属性: path: 指定请求的路径的url; value: value属性和path属性是一样的;
method: 指定该方法的请求方式
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html; produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回; params: 指定限制请求参数的条件; headers: 发送的请求中必须包含的请求头。 * @requestParam(name="指定参数名")
作用:把请求中的指定名称的参数传递给控制器中的形参赋值
属性:
value:请求参数中的名称
required:请求参数中是否必须提供此参数,默认值是true,必须提供;
/**
* 接收请求
* @return
*/
@RequestMapping(path="/hello")
public String sayHello(@RequestParam(value="username",required=false)String name) {
System.out.println("aaaa");
System.out.println(name);
return "success";
}
* @requestBody
作用:用于获取请求体的内容(注意:get方法不可以)
属性:
required:是否必须有请求体,默认是true
/**
* 接收请求
* @return
*/
@RequestMapping(path="/hello")
public String sayHello(@RequestBody String body) {
System.out.println("aaaa");
System.out.println(body);
return "success";
}
* @ResponseBody
作用:
1 使用@RequestBody获取请求体数据
2 @RequestBody注解把json的字符串转换成JavaBean的对象
3 @ResponseBody注解把JavaBean对象转换成json字符串,直接响应
4 json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包
@PathVariable注解
作用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符
属性:
value:指定url中的占位符名称
Restful风格的URL
请求路径一样,可以根据不同的请求方式去执行后台的不同方法
restful风格的URL优点
结构清晰
符合标准
易于理解
扩展方便
/**
* 接收请求
* @return
*/
@RequestMapping(path="/hello/{id}")
public String sayHello(@PathVariable(value="id") String id) {
System.out.println(id);
return "success";
}
@RequestHeader注解
作用:获取指定请求头的值
属性
value:请求头的名称
@RequestMapping(path="/hello")
public String sayHello(@RequestHeader(value="Accept") String header) {
System.out.println(header);
return "success";
}
@CookieValue注解
作用:用于获取指定cookie的名称的值
属性
value:cookie的名称
@RequestMapping(path="/hello")
public String sayHello(@CookieValue(value="JSESSIONID") String cookieValue) {
System.out.println(cookieValue);
return "success";
}
@ModelAttribute注解
作用
出现在方法上:表示当前方法会在控制器方法执行前先执行。
出现在参数上:获取指定的数据给参数赋值。
应用场景
当提交表单数据不是完整的实体数据时,保证没有提交的字段使用数据库原来的数据。
/**
* 作用在方法,先执行
* @param name
* @return
*/
@ModelAttribute
public User showUser(String name) {
System.out.println("showUser执行了...");
// 模拟从数据库中查询对象
User user = new User();
user.setName("哈哈");
user.setPassword("123");
user.setMoney(100d);
return user;
}
/**
* 修改用户的方法
* @param cookieValue
* @return
*/
@RequestMapping(path="/updateUser")
public String updateUser(User user) {
System.out.println(user);
return "success";
}
/**
* 作用在方法,先执行
* @param name
* @return
*/
@ModelAttribute
public void showUser(String name,Map<String, User> map) {
System.out.println("showUser执行了...");
// 模拟从数据库中查询对象
User user = new User();
user.setName("哈哈");
user.setPassword("123");
user.setMoney(100d);
map.put("abc", user);
}
/**
* 修改用户的方法
* @param cookieValue
* @return
*/
@RequestMapping(path="/updateUser")
public String updateUser(@ModelAttribute(value="abc") User user) {
System.out.println(user);
return "success";
}
@SessionAttributes注解
作用:用于多次执行控制器方法间的参数共享;
属性
value:指定存入属性的名称;
只能作用在类上;
@Controller
@RequestMapping(path="/user")
@SessionAttributes(value= {"username","password","age"},types=
{String.class,Integer.class}) // 把数据存入到session域对象中
public class HelloController {
/**
* 向session中存入值
* @return
*/
@RequestMapping(path="/save")
public String save(Model model) {
System.out.println("向session域中保存数据");
model.addAttribute("username", "root");
model.addAttribute("password", "123");
model.addAttribute("age", 20);
return "success";
}
/**
* 从session中获取值
* @return
*/
@RequestMapping(path="/find")
public String find(ModelMap modelMap) {
String username = (String)modelMap.get("username");
String password = (String)modelMap.get("password");
Integer age = (Integer)modelMap.get("age");
System.out.println(username + " : "+password +" : "+age);
return "success";
}
/**
* 清除值
* @return
*/
@RequestMapping(path="/delete")
public String delete(SessionStatus status) {
status.setComplete();
return "success";
}
}