以前我们都是基于xml配置文件来实现bean的依赖注入的,现在有了更方便的注解来实现bean的配置以及注入。
1.bean的配置
利用如下配置ioc容器自动扫描test包下的所有bean并且配置到ioc容器中
<!-- 只管理@Controller类型的bean, 忽略其他型的bean, 如@Service -->
<context:component-scan base-package="test" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />保留@Controller注解的bean
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />//忽略@Service注解的bean
</context:component-scan>
@Service("id")用于标注业务层组件 这里的id是指在applicationcontext.xml(ioc容器)中指定bean的id名,如果不指定它的名字,此bean则默认用第一个字母小写的类名作为它的id。
@Controller("id")用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope("singleton")用于指定bean的作用于。默认单例模式。
singleton:在一个ioc容器中只能实例一次。
prototype:子一个ioc容器中没调用一次实例一次。
以下两个注解配合使用
@Configuration用在类上等价 与XML中配置beans
@Bean(name="",init-method="init")用于(返回此方法类型的实例化的)方法上,将方法的类型加入到ioc容器中,没有设置此bean的名称,此bean的name为方法的名字,@Bean相当于<bean></bean>标签。这样就可以用applicationcontext对象来获取刚才返回实例化的bean。@Bean为单例模式
2.依赖注入
@Required通常用于set方法上,用于检查属性是否设置。
@Autowired(required=false)用于set和构造方法上或属性上,required=false表示如果找不到此bean将不会抛出异常,如果不设置它找不到将会抛出空指针异常,只有一个构造器被标识为true.
还可以注解到set ,list,map比如list<interface>a会将interface类型的所有bean自动注入到list中去
@Order(value=1)value=1,2...表示注入的顺序
@Qualifier(bean1) 只是注入名字为bean1的bean,当一个bean有多个实现类时(比如实现了某些接口的类有多个),用于缩小范围。
3.加载资源
@ImportResource("classpath:xx.xml")加载资源配置文件
@value("${xx值}")读取文件中属性值
4.spring mvc所需注解
@Controller
@RequestMpping("/login",method = RequestMethod.GET)
表示匹配的/login的请求,并且是get请求。
@ResponseBody
spring mvc和json结合,使得后端向前端传送json数据变的更为简单。
例子如下:
(1)pom.xml(所需4个jar包)
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.11</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-core-asl -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.11</version>
</dependency>
注意:jar包之间的组合可能会导致出错,出错记得换较新的版本。
(2)实体类(必须要有无参构造方法)
package com.tsj.entity;
public class Register_message {
private String username_exist;
private String code_error;
private String phonenum_exist;
private String register_success;
private String login_error;
public String getLogin_error() {
return login_error;
}
public void setLogin_error(String login_error) {
this.login_error = login_error;
}
public String getRegister_success() {
return register_success;
}
public void setRegister_success(String register_success) {
this.register_success = register_success;
}
public String getPhonenum_exist() {
return phonenum_exist;
}
public void setPhonenum_exist(String phonenum_exist) {
this.phonenum_exist = phonenum_exist;
}
public Register_message(){
}
public String getUsername_exist() {
return username_exist;
}
public void setUsername_exist(String username_exist) {
this.username_exist = username_exist;
}
public String getCode_error() {
return code_error;
}
public void setCode_error(String code_error) {
this.code_error = code_error;
}
}
(3)控制层(只拿出来一部分)
@RequestMapping(value="/judge_login",method = RequestMethod.POST)
public @ResponseBody Register_message judge_login(HttpServletRequest request, HttpServletResponse response,HttpSession session) throws UnsupportedEncodingException{
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
Register_message rm=new Register_message();
String username=request.getParameter("username");
String password=request.getParameter("password");
User u=new User();
u.setPassword(password);u.setUsername(username);
if(ls.judge_password(u)>=1){
session.setAttribute("username",username);
return rm;
}
else if(ls.judge_password1(u)>=1){
session.setAttribute("username",ls.select_username(username));
return rm;
}
else{
rm.setLogin_error("用户名或密码错误");
return rm;
}
}
(4)这里用jquery ajax进行交互
function judge_login(){
var $username=$(".username_div>input").val();
var $password=$(".password_div>input").val();
$.ajax({
type: "POST",
url: "http://localhost:8080/tsj/judge_login",
data: "password="+$password+"&username="+$username,
dataType : 'json',
success: function(data){
if(data.login_error!=null){
$(".loginerror_message").html(data.login_error).show();
}
else{
window.location.href=$(".redirectURL").html();
}
}
});
}
其它就是spring的配置了,在此省略。
@RequestBody
此注解用法就是前端向后端传送json数据,将此注解放在实体类前,就可方便接受。
@PathVariable
例如:
@Controller
public class TestController {
@RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET)
public String getLogin(@PathVariable("userId") String userId,
@PathVariable("roleId") String roleId){
System.out.println("User Id : " + userId);
System.out.println("Role Id : " + roleId);
return "hello";
}
}
@RequestParam
它的作用和request.getParameter("");的作用一样。
如:
@Controller
public class testController{
@RequestMapping(value="/test")
public String test(@RequestParm String a,HttpServletRequest request){
System.out.println(a);
String st=request.getParameter("a");
System.out.println(st);
//发现st的值和a的值是一样的
}
}
@RequestHeader
这是一个Request 的header部分:
Host localhost:8080
Accept text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language fr,en-gb;q=0.7,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive") long keepAlive) {
}
@CookieValue
public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie) {
}