要把所学到的东西记录下来
@Component("userservice")
public class UserService {
OrderService orderService;
public UserService(OrderService orderService) {
this.orderService = orderService;
}
@ComponentScan("com.zhouyu")
public class AppConfig {
}
public static void main(String[] args) {
// 1. 构建Spring容器
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
// 2. 从容器中获取 userService 对象
UserService userService = (UserService) ctx.getBean("userservice");
System.out.println(userService);
}
我们都知道spring中 的经典开山
呢么 抛一个问题 我们从容器中获取的 cxt.getBean("userService") 获取的这个对象和我们的new 对象有什么区别 ,
--->UserService userService=new UserService();
UserService userService = (UserService) ctx.getBean("userservice");
@Component("orderService")
public class OrderService {
}
@Component("userservice")
public class UserService {
@Autowired
OrderService orderService;
public UserService(OrderService orderService) {
this.orderService = orderService;
}
// 当我再加入一个类的时候orderService 当我再加入一个orderservice时候
此时的 cxt.getbean("userservice") // 拿到的对象中的userservice 中的orderService 有没有值呢?
此时肯定是有值的 ~ 但是 当我如果new UserService() 的时候 肯定就没有值 对吧
~
我们现在从Spring容器中拿到这个userService 这个bean
和我们自己new对象有什么区别呢,
spring帮我们创建的userservice对象,我们cxt.get("userservice") 的时候 就会有orderservice对象
此时就可以看到 spring其实给我们做了一个 属性赋值的操作
-------->
Spring要创建一个对象肯定要用UserService里面的构造方法,当前的userService 中只有一个无参构造,此时通过userService的无参构造创建对象,spring会判断对象中的字段有没有Autowired 的注解,如果有注解的话在进行属性赋值的操作
userservice.class----->构造方法---->对象------>Autowired(属性赋值)--->bean
spring还是根据一个类的无参构造方法 首先 得到一个对象
得到一个对象他里面的属性都是没有值的
然后spring 会给它里面的加了@Autowired的属性去赋值
吧这个对象 进行了依赖注入 (属性赋值之后)
我们这个对象成为bean
spring中还有个初始化前 初始化 初始化后的概念
userservice.class----->构造方法---->对象---->初始化前---->初始化 ---->初始化后------>Autowired(属性赋值)--->bean
何为初始化前?
@Component(“userservice”)
public class UserService {
@Autowired
OrderService orderService;
public UserService(OrderService orderService) {
this.orderService = orderService;
}
private User admin;//表示我这个用户服务有一个管理员 [账号 密码 权限什么的]
我此时UserService 接口中有一个字段user(存储在mysql中 用户 比如说user服务的用户)我要求
这个 这个User 是从数据库查询出来的 比如说账号 密码 以及权限什么的
spring内部大概就是这样写的
for (Field field : Object.class.getFields()) {
Autowired annotation=field.getAnnotation(Autowired.class);
if(!ObjectUtils.isEmpty(annotation)){
field.set();
}
}
我要求 这个userSercice中的 admin 有值
意味着 当我cxt.getBean(”userService“) 的时候 此时的admin 有值并且是从数据库中查询的出来的 我们可以这样做
@PostConstruct
public void a(){
admin=// 连接数据库 查询数据库进行赋值
我要赋值a 这些逻辑我们肯定要去写的 mysql-->user对象 -》admin赋值
}
写一个方法,在这个方法内部去做这件事情 用@PostConstruct 标注
这样spring在创建这个bean的时候 就会遍历他的方法 看他的方法有没有被@PostConstruct 标注 这个过程就叫做初始化前 是处理@PostConstruct 的逻辑的~
再然后 我们也可以实现一个接口InitializingBean
public void afterPropertiesSet() throws Exception {
admin=// 连接数据库 查询数据库进行赋值
我要赋值a 这些逻辑我们肯定要去写的 mysql-->user对象 -》admin赋值
}
// 我们可以在这里afterPropertiesSet 中实现admin的赋值操作
这个完成afterPropertiesSet 就是 初始化的过程
呢么什么是初始化后呢~ 这个初始化比较难 aop 就是在这里产生的
呢么 既然有aop 就会形成一个代理对象
userservice.class---->无参构造方法--->普通对象--->依赖注入(属性赋值)--->初始化前(@PostConstract)--->初始化(InitializingBean)---->初始化后(aop)--->代理对象--->bean
这个就是spring的初始化过程
spring先根据无参构造得到一个对象,然后再根据这个对象的属性赋值 ,然后再去判断某个方法是不是有了@PostConstract注解
之后再去判断你当前对象是不是实现了InitializingBean 接口
如果此时的对象不用进行aop 呢么 我们此时的这个对象就是bean
如果需要进行aop,呢么就会产生一个代理对象
这就是我们说的bean的创建的生命周期
呢么接下来我们 spring 会用哪一种构造生成bean 的呢
默认是无参构造 如果是有参数的化
public UserService(OrderService orderService) {
this.orderService = orderService;
}
//1、 spring默认用无参构造
//2、 如果没有无参构造的话 spring 用有参构造他此时的这个参数 的看他这个容器中有没有有
public UserService( ) {
}
看有值 的也就是说容器中有OrderService对象