1. Spring Boot基本概念
1.1. 核心概念
1.1.1. IoC控制反转
-
IoC ( Inversion of Control ) 控制反转。
- 使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转
-
Spring技术对IoC思想进行了实现
- Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的“外部”
-
IOC主要用来控制哪些对象呢?
- 主要用来控制三层架构,web层、service层、mapper层
-
如何创建对象交给spring管理
- 在需要管理的类上加@Component 注解
- 可以通过使用@Component("名字")的方式,给被管理的对象起别名
-
如何从spring中要对象
- @Autowired
- @Resource("名字")
-
在spring的优化下,我们针对@Component注解进行了优化,提供了语义化的注解,并衍生出了三个注解
- @Controller
- @Service
- @Repository (集成mybatis时不会使用,因为mybatis中mapper是接口)
@Component使用事项
- 默认情况下,如果一个接口的两个实现类都使用了 @Component 注解,且没有设置别名,则在对接口进行注入(@Autowired),且变量名为接口名的时候,框架会因为不知道注入哪个实现类而报错
// 接口I public interface Inter{}
- 默认情况下,如果一个接口的两个实现类都使用了 @Component 注解,且没有设置别名,则在对接口进行注入(@Autowired),且变量名为接口名的时候,框架会因为不知道注入哪个实现类而报错
// 实现类A
@Component
public class ImplA implements Inter{}// 实现类B
@Component
public class ImplB implements Inter{}// 测试类
public class Test{
// 此处会报错,因为接口有两个实现类,且无法区分
@Autowired
Inter inter
}1. 在上述情况下,如果注入的接口的实例化对象,对象名是实现类名的首字母小写形式,是可以找到对应的实现类的
// 接口I
public interface Inter{}// 实现类A
@Component
public class ImplA implements Inter{}// 实现类B
@Component
public class ImplB implements Inter{}// 测试类
public class Test{
// 此处注入的是ImplA
@Autowired
Inter implA
}1. 如果给@Component起别名,即
@Component("别名")
,就可以通过@Resource("名字")的方式获取别名对应的对象 // 接口I public interface Inter{} // 实现类A @Component("A") public class ImplA implements Inter{} // 实现类B @Component("B") public class ImplB implements Inter{} // 测试类 public class Test{ // 此处注入的是ImplB @Resource("B") Inter inter }
1.1.2. DI依赖注入
- DI( Dependency Injection ) 依赖注入
- 在容器中建立bean与bean之间依赖
关系
的整个过程,称为依赖注入
- 在容器中建立bean与bean之间依赖
1.1.3. spring容器
- BeanFactory是IoC容器的顶层接口,初始化BeanFactory对象时,加载的bean延迟加载
- ApplicationContext接口是Spring容器的核心接口,初始化时bean立即加载
- ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能
- ApplicationContext接口常用初始化类
- ClassPathXmlApplicationContext
- FileSystemXmlApplicationContext
1.1.4. 目标:充分解耦
实现方式:
- 使用IoC容器管理bean (Ioc)
- 在IoC容器内将有依赖关系的bean进行关系绑定 (DI)最终效果
最终效果:
- 使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系
1.2. 使用xml方式配置spring容器
1.2.1. bean相关
<bean
id="bookDao" bean的Id
name="dao bookDaoImpl daoImpl" bean别名
class="com,itheima,dao.impl.BookDaoImpl" bean类型,静态工厂类,FactoryBean类控制bean的实例数量
scope="singleton" 生命周期初始化方法
init-method="init" 生命周期初始化方法
destroy-method="destory" 生命周期销毁方法
autowire="byType" 自动装配类型
factory-method="getInstance" bean工厂方法,应用于静态工厂或实例工厂
factory-bean="com.itheima.factory.BookDaoFactory" 实例工厂bean
lazy-init="true" 控制bean延迟加载
/>
1.2.2. 依赖注入相关
此处“简单类型”指基本数据类型和String
<bean id="bookService" class="com,itheima,service.impl,BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/> 构造器注入引用类型
<constructor-arg name="userDao" ref="userDao"/>
<constructor-arg name="msg" value="WARN"/> 构造器注入简单类型
<constructor-arg type="java,lang.String" index="3" value="WARN"/> 类型匹配与索引匹配
<property name="bookDao" ref="bookDao"/> setter注入引用类型
<property name="userDao" ref="userDao"/>
<property name="msg" value="WARN"/> setter注入简单类型
<property name="names"> setter注入集合类型
<list> list集合
<value>itcast</value> 集合注入简单类型
<ref bean="dataSource"/> 集合注入引用类型
</list>
</property>
</bean>
2. 三层架构
在 JavaEE 开发中,系统标准的三层架构包括:表现层(web)、业务层(service)、持久层(dao/mapper)。
web层访问service层,service层访问dao层,dao层访问数据库。
层与层之间,只能按照既定的顺序进行调用,不允许跨层调用。
2.1. 表现层 (web)
web层负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求 web 层,web 需要接收 http 请求,完成 http 响应。 表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。 表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。
2.2. 业务层 (service)
service 层负责业务逻辑处理,web 层依赖业务层,但是业务层不依赖 web 层。 业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。(也就是我们说的,事务应该放到业务层来控制)
2.3. 持久层 (dao/mapper)
dao层(也可以叫mapper层)负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中。
通俗的讲,持久层就是和数据库交互,对数据库表进行曾删改查的。
2.4. 总结
分层的目的是为了解耦,解耦就是为了降低代码的耦合度,方便项目后期的维护和升级。
1、视图层(web层):用于显示数据和接收用户输入的数据 2、业务逻辑层(service层):负责关键业务的处理和数据的传递 3、数据访问层(dao层):主要负责对数据库的直接访问
Comments NOTHING