一、ssm分层架构示意图
ssm分层框架
二、Spring核心
ioc(控制反转)和aop(面向切面开发) Di(Dependencecy Injection) 依赖注入
ioc:将对象的创建权利反转交给Spring框架
IOC的主要目的(好处):降低了程序的耦合度
我们知道在Java程序中要想将对象创建交给程序来完成的话,那就只有使用反射了,其实IOC的底层就是通过反射来完成的
三、使用IOC创建对象,并部署基本的ssm框架
1.创建一个maven项目
2.引入相关jar包
引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
3.创建包
Service层的结构
impl是接口实现类的包
接口
public interface UserService {
void hello();
}
实现类
public class UserServiceImpl implements UserService {
@Override
public void hello(){
System.out.println("业务层,你好");
}
}
4.创建一个测试类
由于刚才在pom.xml中引入了单元测试依赖junit
所以现在只要给普通方法加上@Test注解后该方法也会像main方法一样可以进行测试运行了,如下图
public class UserServiceTest {
@Test
public void run(){
UserService userService = new UserServiceImpl();
userService.hello();
}
}
上面的代码是我们创建对象和调用对象方法的最长用到到的方式,并没有涉及到Spring框架的IOC技术
下面我们来使用IOC完成上面的工作
5.使用IOC创建对象
首先我们要介绍一下,Maven项目里面的三个文件夹
其中类路径用来存放一些配置文件,我们如果想要使用IOC的话就需要一个配置文件对Spring框架进行一些配置。
前面这部分可以随便起名字的,不过我们一般叫他的默认名字applicationContext.xml
applicationContext内容
<?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">
<!--ioc bean管理-->
<bean id="us" class="com.exam.service.impl.UserServiceImpl"></bean>
</beans>
下面是对applicationContext中内容的一些解释
这里解释一下约束:
约束就是规定了文档中能够使用的标签,必须是约束中规定的(比如<bean></bean>),不能够随意书写。
如下图,分别是有约束和无约束的情况:
1.有约束<ss></ss>会报错
2.无约束<ss></ss>不会报错
3.id和class.
<bean id="us" class="com.exam.service.impl.UserServiceImpl"></bean>
<bean></bean> 这是xml的固定写法,用来描述将那个类交给IOC去管理,并创建对象
id=“us”这是一个标识,这里可以简单理解为变量名
class="com.exam.service.impl.UserServiceImpl":这个是需要交给IOC管理的类,由于通过反射去创建对象有一种方式是通过获得类的类全名来创建,所以这里给出的就是类全名
通过这种方式创建的对象,会放入一个IOC容器(或者说是IOC池子中),对象在IOC中的呈现方式是一键值对集合Map的方式呈现的(<key,value>形式,key是对象的标识(例如上面的"us"),value是ioc创建的对象)
ApplicationContext是一个接口,下面的两种实现类有什么区别
//创建spring ioc工厂,目的是加载spring配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext();
ApplicationContext af = new FileSystemXmlApplicationContext();
两个类都是用来加载配置文件xml的
ClassPathXmlApplicationContext:
配置文件如果在类路径下的话话使用此类(常用)
FileSystemXmlApplicationContext
如果配置文件在本地磁盘,例如C盘或者D盘的某个位置,就使用此方法(让配置文件与项目分离管理,不常用)
使用IOC创建对象的代码如下
@Test
public void run2(){
//创建spring ioc工厂,目的是加载spring配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//创建bean对象
UserService userService = (UserService) ac.getBean("us");
userService.hello();
}
四、IOC中bean的属性
IOC.bean
1.id属性 就是给bean起个名字,注意id属性的值必须是唯一的,不能重复
id取值要求必须以字母开头,可以使用数字、连字符、下划线,不能出现特殊字符
2.class属性 值是bean对象的全路径
3.scope:表示bean对象的作用范围
- singleton 单例(默认) 最常用的方式,生命周期跟配置文件相同,加载配置文件时创建实例
- prototype 多例,不是配置文件加载时创建实例,而是获取实例时创建对象
- request 多例,不常用,多用于web项目中,每次http请求时会创建一个创建一个实例
- session 多例,不常用,多用于web项目中,同一个session中可能有很多请求,这些请求共用一个实例
演示一下两个最常用的:
public UserServiceImpl(){ System.out.println("我创建了"); }
<bean id="us" class="com.exam.service.impl.UserServiceImpl" scope="singleton"></bean>
<bean id="us" class="com.exam.service.impl.UserServiceImpl" scope="prototype"></bean>
如果在Test中调用获取对象
@Test public void run2(){ //创建spring ioc工厂,目的是加载spring配置文件 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //创建bean对象 UserService userService = (UserService) ac.getBean("us"); // userService.hello(); }
4.init-method 用于配置一个bean对象创建时的制定方法并调用
UserServiceImpl类中
public void Init(){ System.out.println("对象初始化方法"); }
xml文件
<bean id="us" class="com.exam.service.impl.UserServiceImpl" init-method="Init"></bean>
5.destory-method 用于配置一个bean对象销毁时的制定方法并调用
五、实例化bean的三种方式
1.默认是使用无参数的构造方法(默认方式,基本上都是使用这种)
2.静态工厂实例化方式(好处是可以自己编写业务逻辑,用类调用方法)
package com.exam.util;
import com.exam.service.UserService;
import com.exam.service.impl.UserServiceImpl;
public class StaticFactory {
public static UserService createUs(){
System.out.println("通过静态工厂的方式");
//编写业务逻辑...
return new UserServiceImpl();
}
}
<bean id="us" class="com.exam.util.StaticFactory" factory-method="createUs"/>
3.实例化工厂实例化方式(好处是可以自己编写业务逻辑,用对象调用)
public UserService createUse(){
System.out.println("通过实例化工厂的方式");
//编写业务逻辑...
return new UserServiceImpl();
}
<bean id="dFactory" class="com.exam.util.Factory"/>
<bean id = "us" factory-bean="dFactory" factory-method="createUs"/>