一.MVC思想
M:Model 数据模型(javaBean实体类) V:View 视图(前端jsp,html等等) C:Controller 控制层(处理业务逻辑)
二.高级框架介绍
Dao层: MyBatis,Hibernate,Spring Data jpa Bean管理: Spring Controller层: SpringMVC 微服务:Dubbo,SpringCloud
三.spring的核心
IOC:控制反转
DI:依赖注入
AOP:面向切面
四.环境搭建
1.创建maven项目 2.添加项目依赖 3.添加配置文件 4.编写测试代码 5.运行单元测试
五.IOC容器---控制反转
5.1.手写IOC容器
知识点: xml解析(dom4j+xPath) 反射 集合(list,map)
步骤:
1.在pom.xml中添加dom4j和xPath的依赖
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
2.创建资源文件resoures
新建xxxx.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="userService" class="com.shsxt.service.UserService"></bean>
</beans>
新建bean,里面只有id,class
public class SxtBean {
private String id;
private String clazz;
public SxtBean(String id, String clazz) {
this.id = id;
this.clazz = clazz;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
@Override
public String toString() {
return "SxtBean{" +
"id='" + id + ''' +
", clazz='" + clazz + ''' +
'}';
}
}
3.在java中新建ApplicationContext接口
package com.shsxt.ioc;
/** 接口
*
*
* 手写IOC容器
*/
public interface ApplicationContext {
//抽象方法
public Object getBean(String id);
}
4.在java中新建xxApplicationContext普通类实现接口
public class ShsxtApplicationContext implements ApplicationContext {
//xml配置文件路径
private String xmlPath;
// 存储解析结果
private List<SxtBean> sxtBeans = new ArrayList<>();
//容器来存放反射生成的实例
private Map<String ,Object> beanMap=new HashMap<>();
/** 4.1.解析xml
* 4.2.存放bean
* 4.3.通过Map映射key与实例的关系
*
* @param id
* @return
*/
//构造器快捷键 alt+insert
//带参构造,用来传递xml文件路径
public ShsxtApplicationContext(String xmlPath) {
this.xmlPath = xmlPath;
//1.解析xml
parseXml(xmlPath);
// 3.反射生成bean
initBeans();
}
//重写方法
@Override
public Object getBean(String id) {
return beanMap.get(id);
}
}
4.1解析xml文件
4.2将解析出来的结果添加到集合
/**
* 解析xml
* @param xmlPath
*/
private void parseXml(String xmlPath) {
if(null==xmlPath || "".equals(xmlPath)){
System.err.println("文件不存在");
}else {
// 读取xml文件
SAXReader reader = new SAXReader();
URL url = this.getClass().getClassLoader().getResource(xmlPath);
try {
Document document = reader.read(url);
//获取节点
List<Element> list = document.selectNodes("/beans/bean");
for(Element e : list){
String id = e.attributeValue("id");
String clazz = e.attributeValue("class");
//System.out.println(id + ": "+clazz);
// 添加到集合
sxtBeans.add(new SxtBean(id, clazz));
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
4.3反射生成bean并添加到map容器中
/**
* 反射生成bean
*/
private void initBeans() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
if(sxtBeans.size()>0){
for(SxtBean s : sxtBeans){
String id = s.getId();
String clazz = s.getClazz();
beans.put(id,Class.forName(clazz).newInstance());
}
}
}
5.新建单元测试类,测试代码(快捷键 alt+enter)
public class SxtApplicationContextTest {
@Test
public void test01() throws IllegalAccessException, ClassNotFoundException, InstantiationException {
ApplicationContext context = new SxtApplicationContext("spring.xml");
HelloService helloService = (HelloService) context.getBean("helloService");
helloService.hello();
}
}
六.IOC实例化bean的三种方式
1.通过空构造(默认)
一般使用这种形式,只需配置bean标间,必须保证空构造
2.通过静态工厂
bean初始化
3.通过实例化工厂
使用场景:框架整合
七.DI 依赖注入
所注入的属性,必须存在setter方法
1.注入的方式:
set注入(默认):必须存在setter方法----掌握
构造器注入:必须存在构造器------掌握
静态工厂注入(了解)
实例化工厂注入(了解)
2.p标签和c标签
用来简化注入的配置
八.Bean自动扫描
1.@controller-----control层,servlet层
2.@Service-----service层
3.@Repository-----dao层
4.@Component-----不明确的层(不属于上面三种)
九.依赖注入注解
1.Autowired----通过类型来匹配(跟id无关)
由spring提供,默认通过类型匹配
2.@Resource(name="id")
由jdk提供,默认通过name(id)匹配,如果name为空,则通过类型匹配
后面不带属性,默认name为空
十.bean作用域
1.单例和prototype(原型)
默认单例,每次返回的对象是同一个对象;
自带单例验证方法
非单例设置:xml中配置scope="prototype"每次返回新对象
2.懒加载(lazy-init)
默认非懒加载
十一.bean 的生命周期
1.bean的定义:定义bean标签<bean></bean>
2.bean的初始化:通过init-method="init"来监听bean的初始化操作
3.bean的使用
4.bean 的销毁(需要通过抽象容器的destroy方法销毁)