Spring容器
1.Spring简介:
a)Spring春天
b)官网:https://spring.io
c)设计理念:轮子理念,不要重复创造轮子;
d)Spring可以被理解为一个容器,用于管理其他的框架;
e)Spring个版本下载地址:https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework/spring
2.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.jar
Spring的核心之一. 上下文, Spring上下文.
e) spring-context-support-4.1.6.RELEASE.jar
上下文依赖的jar包.
f) spring-core-4.1.6.RELEASE.jar
Spring的核心, 是Spring最基本的实现(支持)
g) spring-expression-4.1.6.RELEASE.jar
Spring的核心之一. 对el表达式的一个封装.
h) spring-jdbc-4.1.6.RELEASE.jar
Spring对jdbc封装的一个框架
i) spring-jms-4.1.6.RELEASE.jar
java message service. java消息服务, 消息队列.
j) spring-orm-4.1.6.RELEASE.jar
对orm框架的封装, 例如提供了对hibernate框架的支持.
k) spring-oxm-4.1.6.RELEASE.jar
object 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.jar
Spring对javax.servlet包及子包中的接口或类的实现或子类.
- o) spring-webmvc-4.1.6.RELEASE.jar
Spring提供的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.jar
spring-beans-4.1.6.RELEASE.jar
spring-context-4.1.6.RELEASE.jar
spring-core-4.1.6.RELEASE.jar
spring-expression-4.1.6.RELEASE.jar
3.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/beans
http://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: 参数值, 用于基本数据类型和String
e) 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/beans http://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整合MyBatis
6.1 优点
a) 不需要再定义MyBatis的配置文件了
b) 很多对象不需要程序员去创建, 只需要给出配置即可
6.2 缺点
需要导入额外的jar包
asm-3.3.1.jar cglib-2.2.2.jar commons-logging-1.1.1.jar javassist-3.17.1-GA.jar jstl-1.2.jar log4j-1.2.17.jar log4j-api-2.0-rc1.jar log4j-core-2.0-rc1.jar mybatis-3.2.7.jar mybatis-spring-1.2.3.jar mysql-connector-java-5.1.30.jar slf4j-api-1.7.5.jar slf4j-log4j12-1.7.5.jar spring-aop-4.1.6.RELEASE.jar spring-beans-4.1.6.RELEASE.jar spring-context-4.1.6.RELEASE.jar spring-core-4.1.6.RELEASE.jar spring-expression-4.1.6.RELEASE.jar spring-jdbc-4.1.6.RELEASE.jar spring-tx-4.1.6.RELEASE.jar spring-web-4.1.6.RELEASE.jar standard-1.1.2.jar |
6.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/beans http://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; @Override public void init() throws ServletException { ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); studentService = context.getBean("studentService", StudentServiceImpl.class); } @Override protected 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); } } |
Spring容器的更多相关文章
- 一则spring容器启动死锁问题(DefaultListableBeanFactory/DefaultSingletonBeanRegistry)
线上发现一个问题,应用在启动时会卡死,log上并没有什么异常输出,初判应该是死锁问题. 抓现场的thread dump文件, 确实是有两个线程有deadlock问题. 线程一 "HSFBiz ...
- Spring容器深入(li)
spring中最常用的控制反转和面向切面编程. 一.IOC IoC(Inversion of Control,控制倒转).对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的 ...
- 通过单元测试理解spring容器以及dubbo+zookeeper单元测试异常处理
一.先说一个结论:单元测试与主项目的spring容器是隔离的,也就是说,单元测试无法访问主项目spring容器,需要自己加载spring容器. 接下来是代码实例,WEB主项目出于运行状态,单元测试中可 ...
- 同时使用Junit4的@Parameterized参数化测试和Spring容器
转载:http://www.jianshu.com/p/d191fe54915f 整合Spring容器 @SpringApplicationConfiguration(classes = Applic ...
- Spring 容器
Spring提供了两个核心接口:BeanFactory和ApplicationContext,其中applicationContext是BeanFactory的子接口. 他们都可代表Spring容器, ...
- Spring-Context之四:Spring容器及bean的定义
Spring框架的核心功能之一就是控制反转(Inversion of Control, IoC),也叫做依赖注入(dependency injection, DI).关于依赖注入的具体内容可以参见Ma ...
- spring容器对bean生命周期的管理三中方式
spring容器对bean的生命周期管理主要在两个时间点:bean的初始化完成(包括属性值被完全注入),bean的销毁(程序结束,或者引用结束)方式一:使用springXML配置中的init-meth ...
- spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)转
关键字:spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) 应用场景:很多时候我们想要在某个类加载完毕时干某件事情,但是使用了spring管理对象,我们这个类引用 ...
- 整合Servlet到Spring容器
有时在Spring(3.2.5)项目中,如果使用到Servlet,可能希望Servlet实例作为bean受Spring容器管理,这样也能自动注入其他需要的bean,查了下,发现只针对过滤器提供了代理类 ...
- spring容器初始化执行某个方法
在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查. 比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出 ...
随机推荐
- [Swift]LeetCode529. 扫雷游戏 | Minesweeper
Let's play the minesweeper game (Wikipedia, online game)! You are given a 2D char matrix representin ...
- Java接口实现传参
package com.gezhi.interfaces;/** * 新建一个dog类实现接口livingable(狗吃和上厕所都是与生俱来的不应该写成接口) * @author square 凉 * ...
- 面试题:反转字符串(leetcode344)
编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这一问题. 你可以 ...
- HBase之行信息简析
这一节我们简单介绍一下HBase的行信息.文章前半部分会对照源码介绍,后面会有我自己画的图,大家如果对这些信息已经比较了解了,跳过源码对照部分看后面的图,加深一下印象. 下面简单分析一下HBase中对 ...
- github pages绑定域名
网上很多人问 github 绑定域名要不要备案,很多人的回答是: 国内主机需要备案,国外主机不用 这个说法是没错的,但是却没有直接回答出 github pages 是否需要备案! 首先声明 githu ...
- 【Redis篇】Redis持久化方式AOF和RDB
一.前述 持久化概念:将数据从掉电易失的内存存放到能够永久存储的设备上. Redis持久化方式RDB(Redis DB) hdfs: fsimageAOF(AppendOnlyFile) ...
- Python __new__ 实现单例模式 python经典面试题
话不多说,上代码 class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance' ...
- 项目总结四:神经风格迁移项目(Art generation with Neural Style Transfer)
1.项目介绍 神经风格转换 (NST) 是深部学习中最有趣的技术之一.它合并两个图像, 即 内容图像 C(content image) 和 样式图像S(style image), 以生成图像 G(ge ...
- IIS连接数据库:数据库连接出错,请检查连接字串
搞了一早上,在网上看了各种回答,比如:C盘下的Temp文件夹权限.CONN.asp中的数据库路径问题,都不通.最后发现是: 如果使用的是64位系统,原因有可能是没有64位Access连接驱动. 所以解 ...
- .Net 调用中国气象台Web Service
接口地址http://www.webxml.com.cn/WebServices/WeatherWebService.asmx 调用步骤:项目添加服务引用-高级-添加web引用 简单代码: web服务 ...