ioc(inversion of control 控制反转):把对象的创建、赋值、管理工作都交给代码之外的容器实现,也就是对象的创建都是有其他外部资源完成。 控制:创建对象,对象的属性赋值,对象之间的关系管理。
反转:把原来的开发人员管理,创建对象的权限转移给代码之外的容器实现,由容器代替开发人员管理对象、创建对象、给对象赋值。
正转:由开发人员在代码中,使用new构造方法创建对象,开发人员主动管理对象。
容器:是一个服务器软件,一个框架(spring)。
ioc的体现:和servlet原理一样
1:创建类继承HttpServlet
2:在web.xml中注册servlet,使用
<servlet-name>myservlet</servlet-name>
<servlet-class>com.fd.controller.MyServlet</servlet-class>
3:没有创建Servlet对象,没有使用MyServlet myservlet=new MyServlet();
4:Servlet是Tomcat服务器,它能帮你创建对象。Tomcat也称为容器。Tomcat作为容器,里面存放的有Servlet对象,Filter、Listener对象。 ioc的技术实现:DI(Dependency injection)依赖注入是ioc的技术实现。使用者只需要在程序中提供要使用的对象名称就行,至于赋值、查找,都可以交由容器内部实现。
注入就是给属性赋值
spring是使用的DI实现了ioc的功能,spring底层创建对象,使用的是反射机制。
1.1 @RequestMapping
通过RequestMapping注解可以定义不同的处理器映射规则。
1 url路径映射 @RequestMapping(value="/item")或@RequestMapping("/item)@RequestMapping("/user.action") 访问路径 类似servle 的那个
value的值是数组,可以将多个url映射到同一个方法
2.1.1 窄化请求映射
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。
如下:
@RequestMapping放在类名上边,设置请求前缀
@RequestMapping("/book")
常用的注解如下:
@Qualifier 指定名字 和@Autowired 指定类型 自动装配**一般配合使用**
@Resource 用法与@Autowired 用法相似,也是做依赖注入的,从容器中自动获取bean。但还是有一定的区别。
在启动spring的时候,首先要启动容器; 启动spring容器时,会默认寻找容器扫描范围内的可加载bean,然后查找哪些bean上的属性和方法上有@Resource注解; 找到@Resource注解后,判断@Resource注解括号中的name属性是否为空,如果为空:看spring容器中的bean的id与@Resource要注解的那个变量属性名是否相同,如相同,匹配成功;如果不相同,看spring容器中bean的id对应的类型是否与@Resource要注解的那个变量属性对应的类型是否相等,若相等,匹配成功,若不相等,匹配失败。 如果@Resource注解括号中的name属性不为空,看name的属性值和容器中的bean的id名是否相等,如相等,则匹配成功;如不相等,则匹配失败。
@component(泛指组件): (把普通pojo实例化到spring容器中,相当于配置文件中的 ) 泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。
@repository(数据访问组件) (实现dao访问)用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件 //Repository注解作用: 让spring去创建这个接口的动态代理类
@service (业务层组件)(注入dao) 用于标注服务层,主要用来进行业务的逻辑处理,生成spring的bean,这个类的初始化交给spring,这个类就会有spring去创建,去实例化,管理,这个类就放在spring容器里边
@controller(控制层组件)(注入服务)用于标注控制层,相当于struts中的action层 spring的后端控制器
@Resource(引用属性组件):没有参数时,首先按照name自动注入,如果没有匹配的,在按照类型注入,如果有参数时,比如name,如果没有匹配的,就抛异常
@Scope(指定Bean的作用域)
@param mybatis的注解
@Select("select * from user where username=#{uname} and password=#{pwd}")
public User login(@Param("uname") String username, @Param("pwd") String password);
采用#{}的方式把@Param注解括号内的参数进行引用(括号内参数对应的是形参如 uname对应的是username);uname会取username的值,在赋值给sql语句里的uname
@controllerAdvice注解详细解释
这是一个增强的 Controller。使用这个 Controller ,可以实现三个方面的功能:
1.全局异常处理;
2.全局数据绑定
3.全局数据预处理
@ExceptionHandler 注解用来指明异常的处理类型,即如果这里指定为 NullpointerException,则数组越界异常就不会进到这个方法中来。