Spring容器
1.Spring简介:a)Spring春天b)官网:https://spring.ioc)设计理念:轮子理念,不要重复创造轮子;d)Spring可以被理解为一个容器,用于管理其他的框架;e)Spring个版本下载地址:https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework/spring2.Spring FrameworkRuntime
a) spring-aop-4.1.6.RELEASE.jar面向切面编程, 必须导入的jar包b) spring-aspects-4.1.6.RELEASE.jar面向切面编程时依赖的jar包.c) spring-beans-4.1.6.RELEASE.jar是Spring的核心之一, 用于管理对象.d) spring-context-4.1.6.RELEASE.jarSpring的核心之一. 上下文, Spring上下文.e) spring-context-support-4.1.6.RELEASE.jar上下文依赖的jar包.f) spring-core-4.1.6.RELEASE.jarSpring的核心, 是Spring最基本的实现(支持)g) spring-expression-4.1.6.RELEASE.jarSpring的核心之一. 对el表达式的一个封装.h) spring-jdbc-4.1.6.RELEASE.jarSpring对jdbc封装的一个框架i) spring-jms-4.1.6.RELEASE.jarjava message service. java消息服务, 消息队列.j) spring-orm-4.1.6.RELEASE.jar对orm框架的封装, 例如提供了对hibernate框架的支持.k) spring-oxm-4.1.6.RELEASE.jarobject xml model. 小型的框架.l) spring-test-4.1.6.RELEASE.jar用于进行测试, 类似于JUnit的一个框架.m) spring-tx-4.1.6.RELEASE.jar用于使用配置文件实现对实务的管理(声明式事务)n) spring-web-4.1.6.RELEASE.jarSpring对javax.servlet包及子包中的接口或类的实现或子类.o) spring-webmvc-4.1.6.RELEASE.jarSpring提供的mvc控制器层框架. 必须依赖spring-web.jar.支持注解开发, 使用非常简单.p) spring-webmvc-portlet-4.1.6.RELEASE.jar也是一个mvc框架, 使用global session取代了Application的概念.q) spring-websocket-4.1.6.RELEASE.jar可以支持通过socket技术实现web访问. 提供了一种可以自定义中间件的技术3.Spring环境搭建3.1导包至少需要导入5个jar包commons-logging-1.1.3.jarspring-beans-4.1.6.RELEASE.jarspring-context-4.1.6.RELEASE.jarspring-core-4.1.6.RELEASE.jarspring-expression-4.1.6.RELEASE.jar3.2编写配置文件a)Spring 可以看成一个容器,容器对象叫ApplicationContext,用于存放所有Spring管理的对象;b)ApplicationContext是一个接口,通常我们使用的实现类叫ClassPathXmlApplicationContext,用于加载并解析配置文件。c)xml配置文件命名其实是无所谓的,一般情况下,该配置文件的名为:applicationContext.xml,放在src目录下;<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean标签用于创建对象id: 唯一标识, 用于获取对象class: 标识类的全限定路径--><bean id="person" class="com.bjsxt.pojo.Person"></bean></ beans>d)配置文件中通过schema约束xml的格式,根元素为<beans>,<bean>标签用于创建对象,一个<bean>对应一个对象3.3测试Spring容器被创建时就创建对象,通过getBean方法可以获取该对象,通过getBeanDefinationNames可以获取所有Spring管理的对象的名字;public static void main(String[] args) {// 获取Spring容器对象ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 从容器中获取对象Person person = context.getBean("person", Person.class);person.show();String[] names = context.getBeanDefinitionNames();System.out.println(Arrays.toString(names));context.close();}4。Ioc(inversion of control)Ioc ,控制反转,控制指的是创建对象的操作,反转指的是将创建对象的操作交给spring来管理,由Spring来创建和管理对象的过程被称之为Ioc;4.1 使用无参构造器使用无参构造器(默认), 要求实体类必须提供无参构造器.4.2 使用有参构造器使用有参有参构造器, 需要通过constructor-arg标签配置a) name: 参数名b) index: 参数索引c) type: 参数类型d) value: 参数值, 用于基本数据类型和Stringe) ref: 引用, 用于对象类型<bean id="person2" class="com.bjsxt.pojo.Person"><constructor-arg name="name" index="0" type="java.lang.String" value="张三" /><constructor-arg name="age" index="1" type="java.lang.Integer" value="18" /></bean>4.3 使用静态工厂获取对象的方法是静态方法的工厂称之为静态工厂public class PersonFactory {public static Person getBean() {System.out.println("PersonFactory.getBean()");return new Person();}}在配置文件中, 通过class属性和factory-method属性指定使用静态工厂的对应方法创建对象<bean id="person3" class="com.bjsxt.factory.PersonFactory" factory-method="getBean"></bean>4.4 实例工厂(动态工厂)获取对象的方法是实例方法的工厂称之为实例工厂(动态工厂)public class Person2Factory {public Person getBean() {System.out.println("Person2Factory.getBean()");return new Person();}}在配置文件中先配置工厂对象, 再通过factory-bean指定工厂, 通过factory-method指定方法创建对象<bean id="factory" class="com.bjsxt.factory.Person2Factory"></bean><bean id="person4" factory-bean="factory" factory-method="getBean"></bean>1. DI(Dependency Injection)依赖注入. 注入指的是给对象的属性赋值的过程; 依赖指的是依赖由Spring管理的bean对象. 是IoC的一部分.5.1 构造器注入在创建对象时, 通过构造器为对象的属性进行赋值. 参照IoC中的有参构造器的方式.5.2 设值注入通过调用setter方法为对象的属性赋值的过程.<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 设值注入 --><bean id="person" class="com.bjsxt.pojo.Person"><property name="name" value="李四"></property><property name="age"><value>20</value></property><property name="list"><list><value>aaa</value><value>bbb</value><value>ccc</value><value>ddd</value></list></property><property name="teacher" ref="teacher" /></bean><bean id="teacher" class="com.bjsxt.pojo.Teacher"><property name="name" value="张老师"/><property name="age" value="50"/></bean></beans>2. Spring整合MyBatis6.1 优点a) 不需要再定义MyBatis的配置文件了b) 很多对象不需要程序员去创建, 只需要给出配置即可6.2 缺点需要导入额外的jar包asm-3.3.1.jarcglib-2.2.2.jarcommons-logging-1.1.1.jarjavassist-3.17.1-GA.jarjstl-1.2.jarlog4j-1.2.17.jarlog4j-api-2.0-rc1.jarlog4j-core-2.0-rc1.jarmybatis-3.2.7.jarmybatis-spring-1.2.3.jarmysql-connector-java-5.1.30.jarslf4j-api-1.7.5.jarslf4j-log4j12-1.7.5.jarspring-aop-4.1.6.RELEASE.jarspring-beans-4.1.6.RELEASE.jarspring-context-4.1.6.RELEASE.jarspring-core-4.1.6.RELEASE.jarspring-expression-4.1.6.RELEASE.jarspring-jdbc-4.1.6.RELEASE.jarspring-tx-4.1.6.RELEASE.jarspring-web-4.1.6.RELEASE.jarstandard-1.1.2.jar6.3 编写配置文件Spring整合MyBatis的配置文件<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置数据源, 在spring-jdbc.jar中 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/java505" /><property name="username" value="root" /><property name="password" value="root" /></bean><!-- 配置SqlSessionFactory对象, 在mybatis-spring.jar中 --><bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 注入数据源 --><property name="dataSource" ref="dataSource" /><!-- 给类定义别名 --><property name="typeAliasesPackage" value="com.bjsxt.pojo" /></bean><!-- Mapper扫描器, 在mybatis-spring.jar中 --><bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 指定到哪个包进行扫描 --><property name="basePackage" value="com.bjsxt.mapper" /><!-- 指定SqlSessionFactory --><property name="sqlSessionFactory" ref="factory" /></bean><!-- 配置service对象 --><bean id="studentService" class="com.bjsxt.service.impl.StudentServiceImpl"><!-- 注入mapper对象 --><property name="studentMapper" ref="studentMapper" /></bean></beans>6.4 注意事项a) service实现类中需要提供mapper对象, 并提供setter方法;b) servlet中不能自己创建service对象, 应该从Spring容器中取对象, 否则会报空指针.c) 可以配置监听器实现配置文件的加载, 优化Servlet的代码<!-- 全局配置参数, 指定Spring配置文件的位置 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- 配置Spring的监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>@WebServlet("/student")public class StudentServlet extends HttpServlet {private static final long serialVersionUID = 1L;private StudentService studentService;@Overridepublic void init() throws ServletException {ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());studentService = context.getBean("studentService", StudentServiceImpl.class);}@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {List<Student> list = studentService.selAll();req.setAttribute("list", list);req.getRequestDispatcher("/student.jsp").forward(req, resp);}}