一、应用分层
三层架构(前后端分离,对于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。