Spring IOC&DI

发布于:2025-03-01 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、应用分层

三层架构(前后端分离,对于JAVA后端开发者的分层架构)

1)表现层:

展示数据结果,接受用户指令

Controller:控制层,对前端发送的请求进行处理,并给页面响应数据

2)业务逻辑层:

处理业务逻辑

Service:业务逻辑层

3)数据层:

存储和管理与应用程序相关的数据

Dao:数据访问层,持久层(增,删,改,查)

三层架构强调不同维度数据处理的高内聚和低耦合, 将交互界面, 业务处理和数据库操作的逻辑分开.

高内聚指的是⼀个模块中各个元素之间的联系的紧密程度, 低耦合指的是各个模块之间的紧密程度

浏览器发起请求, 先请求Controller, Controller接收到请求之后, 调用Service进行业务逻辑处理, Service再调⽤Dao 

二.IOC

Spring 是包含了众多工具方法的 IoC 容器,了Spring是⼀个开源框架

IOC控制反转(思想),Spring是一个控制反转的容器

在类上面添加 @RestController 和 @Controller 注解, 就是把这个对象交给Spring管理, Spring 框架启动时就会加载该类. 把对象交 给Spring管 理, 就是IoC思想.

当需要某个对象时, 传统开发模式中需要自己通过 new 创建对象, 现在不需要再进行创建, 把创建对象的任务交给容器, 程序中只需要依赖注入

获得依赖对象的过程的控制权被反转,把创建对象的任务交给容器,程序只需要注入依赖就可以

IOC程序解耦 将原来有自己当前类创建的下级类,改为传递方式(注入)下级类发生变化,当前类本身也无需修改,依赖对象的控制权不在由当前类控制,而是把依赖对象注入到当前对象中

我们只需要将原来由自己创建的下级类,改为传递的方式(也就是注入的方式),因为我们不 需要在当前类中创建下级类了,所以下级类即使发⽣变化(创建或减少参数),当前类本⾝也⽆需修 改任何代码,这样就完成了程序的解耦.

创建⼦类的⽅式,改为注⼊传递的⽅式

不再 是使⽤⽅对象创建并控制依赖对象了,⽽是把依赖对象注⼊将当前对象中,依赖对象的控制权不再由 当前类控制了

这样的话, 即使依赖类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的 实现思想

三、DI依赖

容器在运行期间,动态的为应用程序提供运行时所依赖的资源,(依赖注入)

DI是IOC的一种实现

Spring是一个IOC容器,两个基本功能(存,取)

Spring 容器 管理的主要是对象, 这些对象, 我们称之为"Bean". 我们把这些对象交由Spring管理, 由 Spring来负责对象的创建和销毁. 我们程序只需要告诉Spring, 哪些需要存, 以及如何从Spring中取出 对象

IoC控制反转,就是将对象的控制权交给Spring的IOC容器,由IOC容器创建及管理对 象。 也就是bean的存储.

依赖注⼊是⼀个过程,是指IoC容器在创建Bean时, 去提供运⾏时所依赖的资源,⽽资源指的就是对象.

1. Service层及Dao层的实现类,交给Spring管理: 使⽤注解: @Component 2. 在Controller层 和Service层 注⼊运⾏时依赖的对象: 使⽤注解 @Autowired

要把某个对象交给IOC容器管理,需要在类上添加⼀个注解: @Component ⽽Spring框架为了更好的服务web应⽤程序, 提供了更丰富的注解. 共有两类注解类型可以实现: 1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration. 2. ⽅法注解:@Bean.

Spring bean是Spring框架在运⾏时管理的对象, Spring会给管理的对象起⼀个名字

@Controller:控制层, 接收请求, 对请求进⾏处理, 并进⾏响应. • @Servie:业务逻辑层, 处理具体的业务逻辑. • @Repository:数据访问层,也称为持久层. 负责数据访问操作 • @Configuration:配置层. 处理项⽬中的⼀些配置信息

@Controller , @Service 和 @Repository ⽤于更具体的⽤例(分别在控制层, 业务逻辑层, 持 久化层)

在 Spring 框架的设计中,⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中

 

定义多个对象

@Bean 可以针对同⼀个类, 定义多个对象

@Component
public class BeanConfig {
 @Bean
 public User user1(){
 User user = new User();
 user.setName("zhangsan");
 user.setAge(18);
 return user;
 }
@Bean
 public User user2(){
 User user = new User();
 user.setName("lisi");
 user.setAge(19);
 return user;
 }
}
根据方法名获取Bean对象
@SpringBootApplication
public class SpringIocDemoApplication {
 public static void main(String[] args) {
 //获取Spring上下⽂对象
 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio.class, args);
 //根据bean名称, 从Spring上下⽂中获取对象
 User user1 = (User) context.getBean("user1");
 User user2 = (User) context.getBean("user2");
 System.out.println(user1);
 System.out.println(user2);
 }
}

 

 给对象进行重命名

@Bean(name = {"u1","user1"})

当存在多个相同类型的Bean注⼊时,加上@Primary注解,来确定默认的实现.

@Component
public class BeanConfig {
 @Primary //指定该bean为默认bean的实现
 @Bean("u1")
 public User user1(){
 User user = new User();
 user.setName("zhangsan");
 user.setAge(18);
 return user;
 }

使⽤@Qualifier注解:指定当前要注⼊的bean对象。 在@Qualifier的value属性中,指定注⼊的bean 的名称

@Controller
public class UserController {
 @Qualifier("user2") //指定bean名称
 @Autowired
 private User user;
}

@Resource注解:是按照bean的名称进⾏注⼊

@Controller
public class UserController {
 @Resource(name = "user2")
 private User user;
}

@Autowird 与 @Resource的区别 

@Autowired 是spring框架提供的注解,⽽@Resource是JDK提供的注解 • @Autowired 默认是按照类型注⼊,⽽@Resource是按照名称注⼊. 相⽐于 @Autowired 来说, @Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean。