注解;
首先我们要明白 为什么要写注解?
注解是什么? 有什么作用?
今天就让我们带着问题去找答案吧!
首先在我们去搭建spring的环境时,需要去新建一个xml的配置文件 ,里面有一个 管理bean的标签,因为spring框架的特性,所有的bean都是由spring容器来专门管理
所以我们如果书写了一个 bean的话 ,就需要在xml配置文件中配一个bean的容器来专门管理bean
例如这样:
package com.shsxt.service;
public class HelloService {
public void hello(){
System.out.println("hello spring");
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-
xmlns 即 xml namespace xml 使用的命名空间
xmlns:xsi 即 xml schema instance xml 遵守的具体规范
xsi:schemaLocation 本文档 xml 遵守的规范 官方指定
-->
<bean id="helloService" class="com.shsxt.service.HelloService"></bean>
就像这样建立一个helloService的类 我们就需要在配置文件中创建一个管理bean的Ioc容器(最后一行)
但是 试想我们平时做项目会建立很多bean ,如果一个个自己手写的话 那还不得累死,所以在很多的因素之下.spring这时候同样提供了扫描的方式,对扫描到的bean对象统一进行管理, 简化开发配置,提高开发效率。
具体的实现步骤:
包扫描
<context:component-scan base-package="com.shsxt"/>
同时对于被spring 管理的bean 类的定义上需要加入对应的注解定义
开发中建议(开发中的一种约定)
@Repository (数据访问层 即dao组件类)
@Service (标记一个业务逻辑组件类 需要注入dao)
@Controller (标记一个业务组件类 需要注入Service)
@Component(由Component注释的bean 也会被spring管理)
@Component可以代替@Repository、@Service、@Controller
如果对于开发的类实在不明确到底属于哪个层,可以使用@Component注解定义。
@Resource和@Autowired :自动装配bean(实现对bean的注入) 均可标注在字段或属性的setter方法上。
自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring中寻找匹配某个bean需求的其他bean。
@Autowired: 属于spring的注释
在Springorg.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值
@Resource: 不属于spring的注释
是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上
注入方式:
@Autowired: 默认按照类型(ByType 即bean的类型)自动装配,默认情况下要求依赖对象必须存在,
如果允许null值,可以设置它required属性为false。
如果我们想使用按名称装配,可以结合@Qualifier注解一起使用
@Qualifier: 对依赖注入的条件进行限制
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.beans.factory.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;//默认是true 不允许null存在
}
@Controller
public class CustomerController r {
@Autowired //默认依赖的对象必须存在( Customer)
//@Autowired(required = false) 改变默认方式为false 可以存在null
//@Qualifier("CService") 对依赖注入进行限制 按照名称装配
private CustomerService customerService;
@Controller
public class HappyController {
}
@Resource:默认按Name(bean的名字)自动注入,也提供按照Type(bean的类型)注入;
(@Resource 使用比较灵活,既可以指定名字 也可以指定类型,同时属于java的 减少了耦合度 推荐使用)
@RequestMapping: 将url映射到整个处理类或者特定的处理请求的方法
在类前面定义,则将url和类绑定。
在方法前面定义,则将url和类的方法绑定
@RequestMapping中可以使用 method 属性标记其所接受的方法类型,
如果不指定方法类型的话,可以使用 HTTP GET/POST 方法请求数据,
但是一旦指定方法类型,就只能使用该类型获取数据。
@Controller
@RequestMapping("customer")
public class CustomerController extends BaseController {
@Autowired
private CustomerService customerService;
@RequestMapping("index")
public String index(){
return "customer";
}
}
//路径:customer/index
@RequestMapping(value="/inedx",method=RequestMethod.GET)
public String index(){
return "customer" //只能通过get 请求 路径: customer/index
}
@RequestParam :将请求的参数绑定到方法上,默认情况下 参数必须传,但是通过设置requried=false的话,参数可以不传
@RequestMapping(value="/inedx",method=RequestMethod.GET)
public String index(
@RequestParam(defaultValue="10",name="age")int ag
@RequestParam(defaultValue="1",name="flag")boolean flag,
@RequestParam(defaultValue="100",name="s")double s )){
return "customer" //只能通过get 请求 路径: customer/index
}
@RequestMapping(value="/inedx",method=RequestMethod.GET)
public String index(
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "age", required = true) int age) {
//age参数必须传 ,name可传可不传
}
@PathVariable : 该注解用于 @RequestMapping里,会将修饰的方法参数变为可供使用的uri变量从而达到动态绑定
@RequestMapping(value="/inedx/{index}",method=RequestMethod.GET)
public String index(@PathVariable String index) {
}