SpringIOC构造器的注入

  1. 什么是IOC?

      IOC(Inversion of Control )控制反转,所谓控制反转就是把创建对象(bean),和维护对象(bean)的关系的权利从程序中转移到spring的容器(applicationContext.xml),而程序本身不再维护.
    
  2. 什么是DI依赖注入?

    DI(Dependency Injection)依赖注入
    实际上di和ioc是同一个概念,spring设计者认为di更准确表示spring核心技术。

  3. IOC容器
    使用了IOC容器,创建对象和管理对象之间关系的工作由IOC容器来负责

    这里写图片描述

Spring的IOC容器是一个提供IOC支持的轻量级容器类,IOC容器为管理对象之间的依赖关系提供了基础功能。Spring为我们提供了两种容器:BenFactory和ApplicationContex。

ApplicationContext

由org.springframework.context. ApplicationContext接口定义的,是以BeanFactory为基础构建的。是BeanFactory的子类,与BeanFactory相比除了具有基本的Bean创建、管理功能外,还有更多的附加功能,例如国际化等….

eg:

//使用spring
//方法一
        //1.创建Spring容器
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationcontext.xml");
        //2.获得User对象
        User u = (User) ac.getBean("u");
//User u = ac.getBean("u", User.class);//和上面等价 不需要强制转换
        u.tell();

BeanFactory

是由org.springframework.beans.factory. BeanFactory接口定义,他是一个基础的IOC容器,并能提供完整的IOC服务支持。IOC容器需要为其具体的实现提供基本的功能规范,而BeanFactory接口则提供了该功能规范的设计,每个具体的Spring IOC容器都需要满足BeanFactory接口的定义。

eg:

//方法二
        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationcontext.xml"));
        User x = (User) factory.getBean("u");
        x.tell();

总结

 使用ApplicationContext作为IOC容器时,当ApplicationContext初始化完成时,容器中所有的singleton Bean也都被实例化,即ApplicationContext可以对singleton Bean实现预初始化。这意味着当需要使用某个singleton Bean对象时,他已经提前被准备好了,在应用程序中无需等待即可使用。
    使用BeanFactory作为IOC容器时,当BeanFactory初始化时,不会初始化容器中的Bean,而是当调用getBean()时再初始化相应的Bean。
    所以在实际开发中大多数使用ApplicationContext,只有当系统的资源较少的情况下才会考虑使用BeanFactory。

APPlocationCotext接口的三个实现类

ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
XmlWebApplicationContext

依赖注入的三种方式:
依赖注入一般存在三种方式:设值注入、构造方法注入、接口注入。但是在Spring中只支持前两种。

1. 设置注入

·创建一个封装类User.java

//设置注入方式
public class User {
 private String name;
 private String age;

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getAge() {
    return age;
}
public void setAge(String age) {
    this.age = age;
}
public void save(){
     System.out.println("name:"+this.name+"\n"+"age:"+this.age);
}
}

·配置xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- 配置bean文件 -->
<!-- 设置注入 -->
<bean name="u" id="u" class="base.bean.User">
    <property name="name">
       <value >123</value>
    </property>
    <property name="age">
       <value >21</value>
    </property>
</bean>

·编写测试类

public class Test {
 public static void main(String[] args) {  
 //创建spring容器 加载xml配置文件
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  
     User u=(User)context.getBean("u");
     System.out.println(u.getName());
     System.out.println(u.getAge());

 }  
}

输出的值位:name:123,age:12

构造方法注入
·创建一个封装类

public class Roles {
       private int id;  
        private String roleName;  
        public Roles() {  
        }  
        public Roles(int id,String roleName) {  
            this.id=id;  
            this.roleName = roleName;  
        }  
        @Override  
        public String toString() {  
            return "Users [id=" + id + ", name=" + roleName + "]";  
        }  
}

·配置xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 构造方法注入 -->
 <bean id="roles" class="base.bean.Roles">  
    <constructor-arg value="1"/>  
    <constructor-arg value="管理员"/>  
</bean>  
</beans>

·测试类

public class Test {
public static void main(String[] args) {  
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  
       Roles u = (Roles)context.getBean("roles");  
     System.out.println(u.toString());  
 }  
}

输出的值为:Users [id=1, name=管理员]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值