简介:
可以认为spring是一个容器(container)
-
包含内容:
- Ioc/DI 控制反转/依赖注入
- AOP 面向切面编程
-
声明事务。
- test:spring提供的测试功能。
-
core container:核心容器。spring启动最基本的条件。
- spring中最大的容器是,applicationContext。
- Beans:负责创建并管理对象的。
- Core:核心类库。
- Context:上下文参数,获取外部资源或者管理注解。
- SpEl:expression.jar
- Date Access/Integration:封装数据访问层相关内容
- Web:完成web相关功能是需要。
一、Spring环境搭建
- 导包,除了上面所说的启动基本条件的包外,还有一个日志打印的包。
- 在src下新建applicationContext.xml文件
- Spring 容器ApplicationContext,xml文件配置的信息最终都存储到了ApplicationContext容器中。
- spring配置文件:基于schema。语法检查器。
- schema文件扩展名.xsd
- 把schema理解成DTD 的升级版。比DTD具备更好的扩展性,
- 通过bean标签来创建对象。
- 默认是配置文件被加载时候就创建对象
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--
id:获取到的对象标识
class:创建哪个类的对象
-->
<bean id="peo" class="com.qdl.pojo.People" />
</beans>
- 编写测试方法。
- getBean("id值",“返回值类型”)。不写返回值类型默认是object
- getBeanDefinitionNames,获取spring所管理的所有对象名字。
//配置文件一加载 类就会创建,而且会去寻找无参构造方法。
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
People people = ac.getBean("peo",People.class);
System.out.println(people);
//获取spring所管理的对象名字
String[] names = ac.getBeanDefinitionNames();
二、创建对象的三种方式(IoC)
IoC-控制反转
- 是什么?
- 原来有程序员主动new实例化对象的事情,转交给spring负责
- 控制:控制类的对象。
- 发转:转交给spring负责。
- 优点:解耦,程序员不需要管理对象了,解除了对象管理和程序员之间的耦合。
1. 通过构造方法创建
- 无参构造创建:默认创建
- 有参构造创建:需要明确配置
<bean id="peo" class="com.qdl.pojo.People">
ref 是引用另一个bean,value是基本数据类型或string类型
index:指代的是有参构造器中的第几个参数,
name:指代的是有参构造器中参数的名字
type:指代参数的类型。
<constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" value="张三"></constructor-arg>
<constructor-arg index="2" value="23"></constructor-arg>
</bean>
2. 实例工厂
- 工厂设计模式:帮助创建类对象,一个工厂可以生产多个对象。
- 创建实例工厂
public class PeopleFactory {
public People newInstance() {
return new People(2,"秦得力",23);
}
}
- 在xml文件中配置工厂对象和需要创建的对象。
<bean id="factory" class="com.qdl.pojo.PeopleFactory"></bean>
<bean id="peo1" factory-bean="factory" factory-method="newInstance"></bean>
3. 静态工厂
- 创建工厂的静态方法。
- 在xml文件中配置 bean如下,指定其中的工厂方法即可。
<bean id="peo2" class="com.qdl.pojo.PeopleFactory" factory-method="newInstance"></bean>
三、给bean对象参数赋值
1、通过构造方法,在创建类的时候赋初始值。
2、设置注入(通过set方法)
- 设置注入就是走的类的get和set方法。
- 如果是基本数据类型或者string 类型则使用下面的方法。
- 其中的value标签可以写道property标签中间。
<bean id="peo" class="com.qdl.pojo.People">
<property name="id" value="1"></property>
<property name="name" value="秦得力"></property>
<property name="age" value="23"></property>
</bean>
- 如果是参数类型是set
<property name="sets">
<set>
<value>1</value>
<value>2</value>
<value>3</value>
</set>
</property>
- 参数类型是list
- 方法同上,
- 但是如果list中只有一个值,可以使用下面的方法:
<property name="list" value="1"></property>
- 参数类型是数组类型(array)
- 方法同上,
- 如果数组中只有一个值,同样可以同上。
- 参数是map
<property name="maps">
<map>
<entry key="1" value="1"></entry>
<entry key="2" value="2"></entry>
<entry key="3" value="3"></entry>
</map>
</property>
- 参数是properties
<property name="demo">
<props>
<prop key="1">value</prop>
</props>
</property>
四、DI/依赖注入
- 和IoC是一样的,只不过是在其中一个对象中传入另一个对象的参数
- 上面一段是people类,中间传入参数desk类的一个对象,使用DI注入。
<bean id="peo" class="com.qdl.pojo.People">
<property name="desk" ref="desk"></property>
</bean>
-----------------------------------------------------------------
<bean id="desk" class="com.qdl.pojo.Desk">
<property name="id" value="1"></property>
<property name="price" value="100"></property>
</bean>
五、使用spring简化mybatis
1、导包
- mybatis所有的包、spring基本包、spring-jdbc、spring-tx、spring-aop、spring整合mybatis的包。
2、配置xml文件
-- 数据源封装类:获取数据库连接的类
1、导包:JDBC的spring支持包,mybatis的包、
-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/ssm?useSSL=false & serverTimezone=UTC"></property>
<property name="username" value="root"></property>
<property name="password" value="qinyu888"></property>
</bean>
-- 回忆前面我们写mybatis的时候,在opensession之前加载的mybatis.xml
因此,这里需要为其添加datasource。
-->
-- 创建sqlSessionFactory对象 -->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
-- 扫描器,相当于mybatis.xml中的mappers下的package标签,扫描mapper后,会给对应接口创建对象 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
-- 要扫描哪个包 -->
<property name="basePackage" value="com.qdl.mapper"></property>
-- 和factory产生关系 -->
<property name="sqlSessionFactory" ref="factory"></property>
</bean>
-- 这里的ref中为什么要这样写,是因为spring会自动把mpper的类名这样命名 -->
<bean id="peopleService" class="com.qdl.service.impl.PeopleServiceImpl">
<property name="peopleMapper" ref="peopleMapper"></property>
</bean>
3、编写代码
- 编写pojo
- 编写mapper包下时,必须使用接口绑定方案或注解方案(必须有接口)因为再service的实现层中,必须要创建接口对象。不然没办法创建
- 再sevice实现类中声明Mapper接口对象,并生成get和set方法。(为了让spring来代理)
- spring无法管理servlet
public class PeopleServiceImpl implements PeopleService {
private PeopleMapper peopleMapper=null;
public PeopleMapper getPeopleMapper() {
return peopleMapper;
}
public void setPeopleMapper(PeopleMapper peopleMapper) {
this.peopleMapper = peopleMapper;
}
public List<People> show() {
return peopleMapper.selAll();
}
}
4. 编写servlet层代码,流程如下所示
- 两种方式加载配置文件:
- 使用tomcat手动加载配置文件。
- 使用tomcat自动加载配置文件需要步骤如下:
- 导包:spring-web
- 编写web.xml配置文件,让tomcat自动去加载
<!-- 上下文参数 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- spring配置文件 -->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 封装了一个监听器,帮助加载spring的配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
- 书写servlet代码
- 上面注释的的手动加载,下面的是让tomcat管理,加载好我们拿出来用。
//@WebServlet("/people")
public class PeopleServlet extends HttpServlet {
private PeopleService peopleService;
@Override
public void init() throws ServletException {
//下面这一条代码是我们设置tomcat去加载配置文件
//ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
// spring和web整合后的所有信息都存放再webApplicationContext中
//下面这段代码可以让tomcat启动的时候自动加载配置文件。
WebApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
peopleService = ac.getBean("peopleService",PeopleServiceImpl.class);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<People> show = peopleService.show();
PrintWriter out=resp.getWriter();
out.write(show.toString());
}
}