Spring
Spring是开源的具有IOC功能和AOP思想的实例容器,它能管理和装配实例供项目使用。它是轻量型非侵入式的框架,轻量是因为它的大小和开销都很小,非侵入是指Spring开发应用中的对象可以不依赖Spring的API。
Spring IOC
控制反转(Inversion of Control),将原来由代码控制反转为配置Xml文件控制
核心组成:容器 自动注入要使用的类,返回代理对象。
运行时扫描Bean目录创建Bean实例,找到set方法注入要使用的类。
Spring DI
依赖注入(Dependency Injection),IOC的另一种表述方式,组件以预先定义好的方法(例如set方法)接收容器的注入。
Spring AOP
面向切面编程(Aspect-Oriented Programming),AOP 的主要编程对象是切面(aspect),切面就是横切关注点(跨越应用程序多个模块的功能/业务)被模块化的特殊对象。它把应用中可重用的功能提取出来,然后将这些通用功能在合适的时候织入到应用程序中,使得每个业务逻辑位于一个位置, 代码不分散, 便于维护和升级。
Spring配置
1.导入Spring的Jar包
com.springsource.org.apache.commons.logging-1.1.1.jar
spring-beans-4.2.1.RELEASE.jar
spring-context-4.2.1.RELEASE.jar
spring-context-support-4.2.1.RELEASE.jar
spring-core-4.2.1.RELEASE.jar
spring-expression-4.2.1.RELEASE.jar
- xml配置:
<?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">
<!-- 管理实例 p1 -->
<!-- key value 要管理类型的实例-->
<bean id="p1" class="com.senchen.ioc.test.Person">
<!-- set方法 value set方法需要的参数-->
<property name="pid" value="10"/>
<property name="pname" value="哈哈1"/>
<property name="pweight" value="180"/>
</bean>
<!-- 管理实例 p2 -->
<bean id="p2" class="com.senchen.ioc.test.Person">
<constructor-arg index="1" value="哼哼"/>
<constructor-arg type="int" value="201"/>
<constructor-arg type="double" value="20"/>
</bean>
</beans>
3.使用:
package com.senchen.ioc.run;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.senchen.ioc.test.Person;
public class Test {
public static void main(String[] args) {
//创建springIoc容器,web项目使用Listener创建
ApplicationContext cxt=new ClassPathXmlApplicationContext("app.xml");
//从容器中取出要使用的实例
Person a=(Person) cxt.getBean("p1");
System.out.println(a.getPid());
System.out.println(a.getPname());
System.out.println(a.getPweight());
System.out.println("--------------------------");
//从容器中取出要使用的实例
Person b=(Person) cxt.getBean("p2");
System.out.println(b.getPid());
System.out.println(b.getPname());
System.out.println(b.getPweight());
}//main()
}
Spring 使用注解配置
1.再导入Spring的扫描Jar包
spring-context-4.2.1.RELEASE.jar
spring-context-support-4.2.1.RELEASE.jar
2.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.senchen.ioc" ><!-- 扫描并加载ioc及其子包所有注解 -->
<!-- 扫描时不扫描Controller
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
-->
</context:component-scan>
</beans>
3使用注解
package com.senchen.ioc;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import com.senchen.ioc.manager.PersonManager;
import com.senchen.ioc.manager.UserManager;
@Controller //<bean id="pCtrl" class="com.senchen.ioc.PersonController" autowire="byType" />
public class PersonController {
//@Resource(name="aa") //使用byName注入,无需set方法
@Autowired
@Qualifier("aa") //使用byName注入
PersonManager pmng;
//@Resource //使用byType注入,无需set方法
@Autowired //使用byType注入
UserManager umng;
public void preUpd() {
System.out.println(this.getClass()+"....preUpd....");
System.out.println(this.getClass()+"....查找详情....");
System.out.println(pmng);
pmng.list();
System.out.println(this.getClass()+"....查找登陆信息....");
umng.findAll();
}//preUpd
}
Spring MVC
Spring 的一个模块,MVC开发模式中的Model 2 模式的一种实现方式。
核心组成:分发器(DispatcherServlet) 、处理器映射(HanderMapping)、控制器(Controller)、视图解析器(ViewResolver)
运行过程/工作原理:
- 请求提交给DispatcherServlet,它会委托应用系统的其他模块对请求进行真正的处理;
2.DispatcherServlet查询一个或多个HanderMapping,找到处理请求的Controller;
3.DispatcherServlet通过HanderAdapter将请求提交到目标Controller;
4.Controller进行业务逻辑处理后,会返回一个ModelAndView;
5.DispatcherServlet查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象View;
6.视图对象负责渲染返回给客户端。
MVC设计思想
把应用的输入、输出、处理、分离出来,分别称为模型(Model)、视图(View)、控制器(controller)。
模型(Model):完成应用业务/功能的类
视图(View):接收数据、展示数据
控制器(controller):决定调用某个model,负责跳转
Spring MVC的简单配置
1.导入Jar包
com.springsource.org.apache.commons.logging-1.1.1.jar
spring-aop-4.2.1.RELEASE.jar
spring-beans-4.2.1.RELEASE.jar
spring-context-4.2.1.RELEASE.jar
spring-context-support-4.2.1.RELEASE.jar
spring-core-4.2.1.RELEASE.jar
spring-expression-4.2.1.RELEASE.jar
spring-web-4.2.1.RELEASE.jar
spring-webmvc-4.2.1.RELEASE.jar
2.web.xml配置加入前端控制器(DispatcherServlet),传入Spring配置文件的位置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name></display-name>
<servlet>
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:appContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
3.编写Spring MVC的配置文件appContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 自动扫描controller的位置 -->
<context:component-scan base-package="com.senchen.controller"/>
<!-- 试图解析器 springMVC管理的jsp文件位置应该在 /WEB-INF/meto/ -->
<!-- jsp的位置 -->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/meto/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
4.编写Controller加入Spring注解
package com.senchen.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.senchen.entity.Users;
@Controller //加入容器管理
@RequestMapping("/sss") //接收的URL
public class ScondController {
@RequestMapping("/aaa")
public String f1(HttpServletRequest req){
String p0 = req.getParameter("name");
String p1 = req.getParameter("age");
System.out.println("日志1...HttpServletRequest 接收 p0:"+p0+"\t"+p1);
return "redirect:/first.jsp";
}
@RequestMapping("/bbb")
public String f2( String name,int age ){
System.out.println("日志2...方法中参数 接收 "+name+"\t"+age);
return "redirect:/first.jsp";
}
@RequestMapping("/ccc")
public String f2( Users u ){
System.out.println("日志3...对象的get方法 接收 "+u.getUname()+"\t"+u.getUage());
return "second"; //返回了jsp名称(需要视图解析器拼凑 前缀+名字+后缀)
}
}