Ioc 降低代码的耦合性,
面向接口开发通过多态思想 减少代码重复性
Spring容器
由容器管理对象的生命周期(出生到销毁)
容器加载对象 注入给用户
1.xml。
准备xml配置文件 ,准备bean标签 <bean= id="" class="">
把bean当做map集合来
key是id的值 value是通过class实例化的对象
2.注解开发
准备配置类 @COfiguration+@baen
*****
3.工厂模式
*****
二、Spring框架
1.1单例和多例
单例:在内存中只有一份
多例 在内存中可能有多份
springdemo5_base
规则1:默认情况下spring管理的对象都是单例的
1.2懒加载机制
1.2.1说明 如果Spring容器创建,对象立即创建 则该加载方式为立即加载 容器启动就创建
如果Spring容器创建 对象使用时创建 则该加载方式为 懒加载 用时才创建
@Lazy添加表示为懒加载
测试说明 主要测试对象中的无参构造什么时候执行
12.3多例和懒加载的关系
只要对象是多例模式 都是懒加载!在单例模式中控制懒加载才有效
1.2.4lazy使用场景
场景1 服务器启动时 如果加载太多资源 必然导致服务器启动慢,可以适当将不重要资源设置为懒加载
场景2 有时用户需要一些特殊的链接 而链接的创建需要很长的时间 可以使用懒加载
1.3Spring生命周期的管理
1.3.1生命周期的说明
一个对象从创建到消亡可以划分为四个阶段 如果需要对程序进行干预 则可以通过周期方法进行干预(回调函数/钩子函数/接口回调)
初始化、对象创建、对象使用、销毁
生命周期函数自动调用
1.3.2生命周期函数方法的使用
@postconstruct 对象创建之后立即调用
@PreDestroy 销毁前调用
可以对类资源进行干预
1.4依赖(DI)
1.4.1创建结构
准备User dog cat
dog cat 向用户user对象注入
1.4.2 @AUtowired注解
在对象中如果需要属性的注入 一般使用这个 可以将spring容器中的对象 自动注入到属性之中
注入方式:
1.默认按照类型注入
如果注入属性是接口 则自动注入接口的实现类
2.按照名称注入(key)
一般不用
重要前提: 如果需要依赖注入 则对象必须交给spring容器管理
1.4.3接口多实现
一个接口两个实现类没法运行
一个接口一个实现类
@Qualifiar 指定id 不单独使用 和 @Autowried
@Resource 注解 @Autowried和@Qualifiar的结合
1.5MVC设计思想
1.5.1MVC思想说明
经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。其中,View的定义比较清晰,就是用户界面
m:model 业务模型
v:view 用户界面
c:contrl 控制层
mvc是一种思想 降低代码的耦合性
基于mvc这种设计思想
1.5.2层级代码思想
mvc设计思想,实现了前后端的松耦合 但是根据实际开发很多业务逻辑复杂如果将所有的代码都写到一个java类中这样打码结合很臃肿,为了很好的实现mvc设计思想 所以后端代码也应该分层
分层说明
1.controller层 与前段业务交互 @controller控制层
2.sevice层 业务层 编辑业务逻辑 @service业务层
3. 持久层 dao/mapper 实现数据的相关操作 @Repository
采用面向借口开发
MVC>三层代码结构
1.6三层代码的结构
serviece调mapper
package com.jt.sevice;
import com.jt.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService{
@Autowired//借口是实现类对象
private UserMapper userMapper;//默认按照类型注入
@Override
public void add() {
userMapper.addUser();
}
}
mapper--service--control
2-----------2-----------1
package com.jt.control;
import com.jt.sevice.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
//control这个层只有类 不用写借口
@Autowired
private UserService userService;//不创实现类 创借口 AUtowried碰见借口就调实现类
public void addUser(){
userService.addUser();
}
}
spring测试一定要整配置类
package com.jt.Config;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Repository;
@Configurable
@ComponentScan("com.jt")
public class SpringConfig {
}
package com.jt.test;
import com.jt.Config.SpringConfig;
import com.jt.control.UserController;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class testDemo {
@Test
public void testdemo1(){
ApplicationContext context=
new AnnotationConfigApplicationContext(SpringConfig.class);
UserController userController=context.getBean(UserController.class);
userController.addUser();
}
}
1.7谈一谈对IOC、DI的看法
历史:传统代码其中的属性对象都是通过new手动创建 这样代码耦合性高不方便扩展
功能:ioc 由spring容器管理对象的生命周期
使得对象与对象的耦合性降低
di是依赖注入 只有被spring容器管理的对象才可以被依赖注入component
默认条件下采用类型注入 特殊需求也可以通过名称注入@Quailifiar
spring ioc和di相互配合可以极大程度降低耦合
作用:spring采用ioc和di的设计方式 可以整合其他第三方的框架 使得程序的调用浑然一体
1.8注解赋值
@value 注解 可以直接为基本类型赋值
user.properties
对象中属性一般都是业务数据 如果需要给业务数据辅助 一般采用properties文件更加灵活
一般在resoures目录下