Spring<杂谈~1>

要把所学到的东西记录下来

@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对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值