spring的简单使用-ioc

IOC容器是什么?

IOC其实就是一个对象的容器。全称Inversion Of Control 控制反转,核心的作用就是将原来由开发人员来控制的对象管理操作交由Spring来管理。

SpringIOC不仅帮我们管理了对象的创建,还包括给对象增加了生命周期行为、作用域(单例、非单例)、懒加载。 配合Spring的DI, 更能方便的解决对象属性值注入、对象之间的依赖注入问题。

IOC容器解决了什么问题?

简单工厂模式

//抽象工厂
public interface Factory{
    public void production();
}
//具体实现汽车工厂
public class CarFactory extends Factory{
    public void production(){
        System.out.println("汽车");
    }
}
//具体实现工厂
public class BicycleFactory extends Factory{
    public void production(){
        System.out.println("自行车");
    }
}


//类似于ioc容器
public class SalesAgent extends Factory{
     Factory f = null;
     public Factory select(String n){
        switch(n){
            case "汽车":
                f = new CarFactory();
                 System.out.println("汽车生产完成!");
                break;    
            case "自行车":
                f = new BicycleFactory();
                 System.out.println("自行车生产完成!");
                break;  
            default:
               System.out.println("不生产该产品!");
                break;
        }
       return f;
    }
}

其实IOC容器就像上面所示的 SalesAgent 类代理创建其他类,不需要自己在手动创建所需的类,而是通过管理容器获取。

如何使用IOC容器管理Bean

xml方式

  1. 创建 xml 文件 spring模板 *.xml

  2. 声明受管理的类

    • 直接在xml文件里面配置

      
      
    • 在xml文件内部配置扫描类

      
      


    
    
  3. 使用IOC容器

    //声明使用
    ApplicationContext ioc = new ClassPathXmlApplicationContext("配置名.xml"); 
    //获取方式
    //1.通过类型
     ioc.getBean(book.class);
    //2.通过名称或id
     ioc.getBean("book");
    //3.通过名称及类型获取
     ioc.getBean("book",book.class);
    

Annotation方式

  1. 声明IOC容器类

    @Configuration
    public class MyApplication{}
    
  2. 声明受管理的类

    • 直接在IOC容器类里面配置

      @Bean
      public Book book(){
          Book b = new Book();
          return b;
      }
      
    • 在lOC容器类文件配置扫描类

      @Configuration
      @ComponentScan(basePackage="com.sen.spring")
      public class MyApplication{}
      
  3. 使用IOC容器

    //声明使用
    //两种方式
    //1
    ApplicationContext ioc = new AnnotationConfigApplicationContext(MyApplication.class); 
    //2 配合autowired使用
    @ContextConfiguration(classes = MyConfigration.class)
    
    //获取方式与xml方式相同
    
    

指定Bean的生命周期方法

  • Singleton Bean的生命周期

    • 初始化时机: 在IOC容器初始化时,就会把配置的所有单例bean实例化。
    • 销毁时机:在IOC容器销毁时,所有bean的销毁方法会被调用。
  • Prototype Bean的生命周期

    • 初始化时机: 在实际使用该bean的时候,比如:getBean、获取依赖此bean的其他bean需要使用
    • 销毁时机: 在IOC容器销毁时。(但是通过destroy-method指定的声明周期方法不会被调用,也就是说Spring不提供prototypebean完整的生命周期管理)
  • 如何指定生命周期的回调方法

    • xml中的init-method、destroy-method

      
      
    • 注解方式@PostConstrutor、@PreDestroy

      //在方法上添加注解
          @PostConstruct//初始化
          public void init(){
              System.out.println("初始化");
          }
          @PreDestroy//销毁
          public void destory(){
              System.out.println("消亡");
          }
      
  • 指定默认的声明周期回调方法

    • 在xml中,通过在beans标签上添加default-init-method、default-destory-method来指定
      • 有初始化 或 消亡方法的类 初始化 和 消亡时自动调用,没有的也不会出现异常
    • 在注解配置中,没有对应的方法可以设置所有bean默认的生命周期回调

Bean的懒加载

lazy-init属性

默认是false

懒加载配置主要是针对单例的bean,因为它默认是在容器初始化时就被实例化了。

Bean初始化的三种方式

构造方法方式(最常用)


静态工厂方法



实例工厂方法





Bean 的命名:id 和 name 属性的区别

在XML中配置中可以通过标签上的id、name属性值给一个bean命名,以便在其他地方引用。

id属性: bean的唯一名称,只允许出现一个值。且同一个IOC容器中不允许出现两个id值一样的bean。

name属性: 和id类似也是给bean命名。但是name属性的值可以有多个,多个值之间使用英文逗号(,)或者英文分号(;)或者空格符隔开

如何优雅的停止非Web Spring应用

添加一个shutdown hook。所有派生自ConfigurableApplicationContext接口的实现类都支持此方法

ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("xxx.xml");

ctx.registerShutdownHook(); //注册停止回调

你可能感兴趣的:(spring的简单使用-ioc)