网站建设需要用到iis吗,中外商贸网站建设,室内设计家装设计,想把比尔的网站封了如何做作者#xff1a;~小明学编程 文章专栏#xff1a;Spring框架 格言#xff1a;热爱编程的#xff0c;终将被编程所厚爱。 目录
Spring更加高效的读取和存储对象
存储bean对象
五大注解
关于五大类注解
对象的注入
属性注入
构造方法注入
Setter注入
三种注入方式的… 作者~小明学编程 文章专栏Spring框架 格言热爱编程的终将被编程所厚爱。 目录
Spring更加高效的读取和存储对象
存储bean对象
五大注解
关于五大类注解
对象的注入
属性注入
构造方法注入
Setter注入
三种注入方式的区别
Resource 和 Autowired 的区别
Bean的作用域和生命周期
Spring的执行流程
Bean的生命周期 Spring更加高效的读取和存储对象
存储bean对象
前面我们所介绍的方法过于的繁琐我们可以通过注解来快速实现上述的功能。
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contenthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsdcontent:component-scan base-packagecom.beans/content:component-scan
/beans
首先是我们所依赖的资源其中com.beans是我们所要扫描的类的包。
五大注解
Controller 控制器Service 服务Repository 仓库Configuration 配置Component 组件
利用上面这五大注解都可以完成我们对象的注入。
Service
public class UserService {public void sayHi() {System.out.println(hi Service);}
}
Repository
public class UserRepository {public void sayHi() {System.out.println(Hi Res);}
}
Controller
public class UserController {public void sayHi() {System.out.println(hello);}
}
Configuration
public class UserConfig {public void sayHi() {System.out.println(Hi Con);}
}
Component
public class UserComponent {public void sayHi() {System.out.println(Hi Com);}
}
获取 public static void main1(String[] args) {//1.获取上下文ApplicationContext context new ClassPathXmlApplicationContext(spring-config.xml);//2.得到beanUserController userController context.getBean(userController,UserController.class);userController.sayHi();UserService userService context.getBean(userService,UserService.class);userService.sayHi();UserRepository userRepository context.getBean(userRepository,UserRepository.class);userRepository.sayHi();UserConfig userConfig context.getBean(userConfig,UserConfig.class);userConfig.sayHi();UserComponent userComponent context.getBean(userComponent,UserComponent.class);userComponent.sayHi();}
获取的时候我们需要注意这个beanname这个beanname是根据如下的逻辑。 关于五大类注解
既然我们五种注解的随便一种都能完成我们的对象的注入那么我们为什么还是需要五种注解呢 因为我们一个软件是分为多个层面的分为多层有助于我们的管理和控制。
Configuration 就是配置层关于当前项目中的所有配置都会写在这个文件夹里。 Controller 就是控制层就是前端参数校验主要就是校验前端数据的合理性和正确性。 Service 就是服务层负责数据的组装和接口调用。更直白的说服务器九四 “牵线搭桥” 让程序去调用对应的功能/接口/服务。 Repository 叫做仓库但其实是 数据持久层也叫做 Dao 层就是对数据进行持久化操作对数据库进行增删改查操作。
我们使用不同的注解便于我们了解不同的代码的功能同时也方便我们对代码进行一个管理。
当然这五大类注解之间是有一定的关系的 可以看到我们的configuration注解是调用了我们的component注解的其它几个注解的实现方法也是如此可以说我们的component注解是我们其它四大注解的一个父类。
对象的注入
前面我们了解了怎么样将对象给存储起来也就是使用五大注解可以高效方便的将我们的对象给放在spring中但是当我们想要使用的时候有没有什么方式可以比较高效的来使用呢下面就介绍三种方式来实现我们对象的一个注入。
属性注入
通过 Autowired 注入
Controller
public class UserController {Autowiredprivate UserService userService;public void sayHi() {userService.sayHi();}
}
这里我们就通过关键字Autoeired的关键字来直接实现我们对象的一个注入然在下面的方法之中我们就可以直接调用我们注入好的对象的方法了。 public static void main(String[] args) {//1.获取上下文ApplicationContext context new ClassPathXmlApplicationContext(spring-config.xml);UserController userController context.getBean(UserController.class);userController.sayHi();//hi Service}
构造方法注入
Controller
public class UserController {
// Autowiredprivate UserService userService;public UserController(UserService userService) {this.userService userService;}public void sayHi() {userService.sayHi();}
}
这里我们可以直接通过构造方法的方式来进行对象的一个注入但是值得我们注意的是当我们的构造方法不止一个的时候就必须要使用Autowired关键字了不然会报错。
Controller
public class UserController {
// Autowiredprivate UserService userService;Autowiredpublic UserController(UserService userService) {this.userService userService;}public UserController(UserService userService,int num) {this.userService userService;}public void sayHi() {userService.sayHi();}
}
Setter注入
Controller
public class UserController {private UserService userService;Autowiredpublic void setUserService(UserService userService) {this.userService userService;}public void sayHi() {userService.sayHi();}
}
同样我们也可以使用Setter这样一个方法来进行一个注入。
三种注入方式的区别
属性注入特点是写法简单但是通用性不好只能运行在 IoC 容器下如果是 非 IoC 容器的话就会出现问题。构造方法注入通用性更好。因为构造方法的优先级是最高的。确保使用注入对象之前对象一定初始化过了。当构造方法注入参数太多时就需要检查自己的代码是否符合单一设计原则的规范了。构造方法注入也是 Spring 推荐的注入方法。Setter 注入是早期 Spring 版本推荐的写法但是通用性没有构造方法注入通用因为只有一个参数。
Resource 和 Autowired 的区别
相同点都可以完成对象的注入。
不同点
出身不同Resource 来自于 JDKAutowired 是由 Spring 框架提供的。Autowired 支持属性注入构造方法注入 和 Setter 注入而 Resource 不支持构造方法注入。支持的参数不同Resource 支持更多的参数设置比如 name、type 设置。而 Autowired 只支持 required 参数设置。
Bean的作用域和生命周期
在我们使用bean的时候其实默认是用的同一个bean也就是说如果我们对其中的bean进行一个更改的话那么当我们再次去使用这个bean此时依然是更改之后的bean。
Component
public class UserBean {Bean(name {user,user1})
// Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public User user2() {User user new User(15,lisi);return user;}Bean(name {user2})public User user1() {User user new User(12,zhangsan);return user;}
}
Component
public class BeanScope1 {Autowiredprivate User user2;public User getUser() {user2.setStr(aaa);return user2;}
}
Component
public class BeanScope2 {Autowiredprivate User user2;//user2必须事被注入过的public User getUser() {return user2;}
}
这个时候我们注入了两次bean对象此时查看输入的结果 public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(spring-config.xml);BeanScope1 beanScope1 context.getBean(BeanScope1.class);System.out.println(beanScope1.getUser());BeanScope2 beanScope2 context.getBean(BeanScope2.class);System.out.println(beanScope2.getUser());} 可以看到我们在对其进行更改之后再次注入仍然是更改之后的User。
产生这样的原因是因为 Bean 在 Spring 中默认情况下是单例状态也就是所有人的使用都是同一个对像。这样可以很好的节约资源避免资源的浪费。 Bean 的六种作用域 singleton单例作用域默认在这种模式下的 Bean 在 IoC 容器里面只存在一个实例。 prototype原型作用域多例模式每次对作用域下的 Bean 请求都会创建新的实例然后再去获取 Bean。 request请求作用域Spring MVC每次 Http 请求会创建新的 Bean 实例类似于 prototype。 session会话作用域Spring MVC在一个 http session 中定义一个 Bean 实例。记录用户的登录信息。 application全局作用域Spring MVC更多人使用的时候就用 application。也是单例模式应用在 Web 应用的上下文信息。 websocketHttp WebSocket 作用域Spring WebSocket在 WebSocket 会话中使用。 当我们想要改变其作用域的时候可以通过Scope 的注解来进行改变 可以看到此时我们 所注入的对象就都是新的对象了。
设置作用域的时候只需要通过 Scope 注解就可以了
直接设置值Scope(“prototype”)使用枚举设置Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
Spring的执行流程
1.我们首先是要启动我们的容器去加载我们的配置文件。 也就是我们上面的这段代码。
2.接着就是根据我们的配置来完成我们的bean初始化。 通过扫描包中的spring注解。
3.注册 Bean 对象到容器中只有在包扫描的路径上的类且使用 Spring 的注解才可以被注册到容器当中。 4.装配 Bean 属性也就是把 Bean 注册到其他类当中 Bean的生命周期
Bean的生命周期就是Baen从诞生到销毁的一个过程 。
实例化 Bean为 Bean 分配内存空间设置属性Bean 注入和装配Bean 初始化 a执行各种通知各种Aware如BeanNameAwareBeanFactoryAwareApplicationContextAware 的接口方法。 b执行 BeanPostProcessor 初始化前置方法。 c执行 PostConstruct 初始化方法依赖注入操作之后被执行。 d执行自己指定的 init-method 方法如果有指定的话 e执行 BeanPostProcessor 初始化后置方法。使用 Bean销毁 Bean通过方法来销毁容器如 PreDestroy、DisposableBean、destroy-method其大概的流程图就是这样的。
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contenthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsdcontent:component-scan base-packagecom.beans/content:component-scanbean idbeanLifeclasscom.beans.BeanLife init-methodinit/bean
/beans
package com.beans;import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;/*** Created with IntelliJ IDEA.* Description:* User: 86184* Date: 2023-03-06* Time: 22:07*/
Component
public class BeanLife implements BeanNameAware {PostConstructpublic void Post() {System.out.println(PostConstruct);}PreDestroypublic void Pre() {System.out.println(pre);}public void use() {System.out.println(use);}public void init() {System.out.println(init);}public void setBeanName(String s) {System.out.println(通知);}
}执行流程如上。