IOC——Spring的bean的管理(xml配置文件)

Bean实例化(三种方式)

  1、使用类的无参构造进行创建(大多数情况下)

  <bean id="user" class="com.bjxb.ioc.User"></bean>

    (1)上面的代码使用的就是默认的无参构造的方式进行Bean的实例化

    (2)使用这种方法我们需要注意,如果类中没有无参构造,会出现异常

 

  2、使用静态工厂创建

    (1)创建静态的方法,返回类的对象,以User对象为例

  public class UserFactory {
  
      // 静态方法,返回User对象
      public static User getUser() {
          return new User();
      }
  }

 

    (2)配置文件中使用静态工厂创建对象

<bean id="user" class="com.bjxb.ioc.UserFactory" factory-method="getUser"></bean>

 

  3、使用实例工厂创建

     (1)创建普通方法,返回类的对象,以User对象为例

public class UserFactory {

    // 普通方法,返回User对象
    public User getUser() {
        return new User();
    }
}

 

    (2)配置文件中使用实例工厂创建对象

     <!-- 创建工厂对象 -->
     <bean id="userFactory" class="com.bjxb.ioc.UserFactory"></bean>
     <!-- 配置Bean对象 -->
     <bean id="user" class="com.bjxb.ioc.User" factory-bean="userFactory" factory-method="getUser"></bean>

 

 Bean标签的常用属性

  1、id属性

    给当前bean起名称,不能包含特殊符号,我们可以根据id值得到配置对象.

  2、class属性

    给当前bean指定对象所在类的全路径.

  3、name属性

    给当前bean起名称(与id属性类似),但是id属性值不能包含特殊符号,而在name属性值里面可以包含特殊符号。在Struts1框架中,action起名可以写符号(比如加上#),为了整合Struts1,解决遗留问题,扩展了name属性值。 

  4、scope属性

    scope属性可以指定Bean的作用范围

    (1)singleton:默认值,单例,对象只创建一次。

    (2)prototype:多例的。每次使用都会创建一个新的对象。

    (3)request:WEB项目中,Spring创建一个Bean的对象,将对象存到request域中。

    (4)session:WEB项目中,Spring创建一个Bean的对象,将对象存到session域中。

    (5)globalSession:WEB项目中,应用在Prolet环境,如果没有Prolet环境,那么globalSession相当于session。

Bean的属性注入

  1、创建对象的时候,类中的属性被设置了默认值,称为bean的属性注入

  2、属性注入的三种方式(Spring只支持前两种,用的最多的是第一种——set方法注入):

    (1)Setter注入:使用属性的set方法进行注入。

public class TestUser {

    private String name;
    
    public void setName(String name) {
        this.name=name;
    }
}

public static void main(String[] args) {
    TestUser user = new TestUser();
    user.setName("花咖");
}

    (2)构造器注入:使用有参数的构造器进行注入。

public class TestUser {

    private String name;
    
    public TestUser(String name) {
        this.name = name;
    }
}

public static void main(String[] args) {
    TestUser user = new TestUser("花咖");
}

    (3)接口注入:让类继承带有方法的接口,在实现类继承的方法中,进行属性注入。  

public interface UserDao {

    void InjectTest(String name);
}

public class TestUser implements UserDao{

    private String name;
    
    @Override
    public void InjectTest(String name) {
        // TODO Auto-generated method stub
        this.name=name;
    }
}

  3、Spring中Bean的属性注入如何运用

    (1)Set方法注入

  实体类:

public class PropertyDemo1 {

    private String bookname;
    
    // set方法
    public void setBookname(String bookname) {
        this.bookname = bookname;
    }
    
}

  配置类中代码(默认是applicationContext.xml):

<!-- 使用set方法注入属性 -->
<bean id="demo1" class="com.bjxb.ioc.PropertyDemo1">
     <!-- 注入属性值
         name属性,类里面定义的属性名称
         value属性,设置具体的值
      -->
     <property name="bookname" value="大话设计模式"></property>
 </bean>

    (2)有参构造方式注入

  实体类:

public class PropertyDemo2 {

    private String uname;
    
    public PropertyDemo2(String uname) {
        this.uname = uname;
    }
}

  

  配置类中代码(默认是applicationContext.xml):

<beans>
    <!-- 使用有参数构造注入属性 -->
    <bean id="demo2" class="com.bjxb.ioc.PropertyDemo2">
         <!-- 使用有参构造注入 -->
         <constructor-arg name="uname" value="花咖"></constructor-arg>
    </bean>
</beans>   

  4、重点——注入对象类型的属性

    (1)service 中 注入 dao 层的类

  UserDao:

public class UserDao {

    public void add() {
        System.out.println("dao.add........");
    }
}

    

  UserService:

public class UserService {

    // 1.定义dao类型属性
    public UserDao dao;
    
    // 2.生成set方法
    public void setDao(UserDao dao) {
        this.dao = dao;
    }
    
    public void add() {
        System.out.println("service.add.......");
        dao.add();
    }

}

  配置类中代码(默认是applicationContext.xml):

<!-- 注入对象类型的属性 -->
<!-- 配置service和dao对象 -->
<bean id="userDao" class="com.bjxb.ioc.UserDao"></bean>
<bean id="userService" class="com.bjxb.ioc.UserService">
    <!-- 注入dao对象
        name属性值:service类里面的属性名称
        现在不要写value属性,因为刚才是字符串,现在是对象
        写ref属性,配置dao的bean标签中的id值
     -->
    <property name="dao" ref="userDao"></property>
</bean>

  5、使用P命名空间进行属性注入(对于Setter注入简化

    (1)首先在beans标签中加入如下属性(复制上一行的beans命名空间):

    (2)然后我们在注入属性时使用 P 命名空间的方式:

      实体类:

public class Person {

    private String pname;
    
    public void setPname(String pname) {
        this.pname=pname;
    }
    
}

      

      配置类中代码(默认是applicationContext.xml):

<!-- p名称空间注入 -->
<bean id="person" class="com.bjxb.propertyTest.Person" p:pname="花咖"></bean>

  6、注入复杂类型属性

    (1)数组

    (2)list 集合

    (3)map 集合

    (4)properties 类型

     实体类:

public class Person {
private String[] arrs;
    private List<String> list;
    private    Map<String, String> map;
    private Properties properties;
    
    public void setArrs(String[] arrs) {
        this.arrs = arrs;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

}

    

    配置类中代码(默认是applicationContext.xml):

<!-- 注入复杂类型的属性值 -->
<bean id="person" class="com.bjxb.propertyTest.Person">
    <!-- 数组 -->
    <property name="arrs">
        <array>
            <value>小红</value>
            <value>小黄</value>
            <value>小蓝</value>
        </array>
    </property>

    <!-- list -->
    <property name="list">
        <list>
            <value>小白</value>
            <value>小黑</value>
            <value>小太</value>
        </list>
    </property>

    <!-- map -->
    <property name="map">
        <map>
            <entry key="aa" value="Lucy"></entry>
            <entry key="bb" value="Jerry"></entry>
            <entry key="cc" value="Tom"></entry>
        </map>
    </property>

    <!-- properties -->
    <property name="properties">
        <props>
            <prop key="driverclass">com.mysql.jdbc.driver</prop>
            <prop key="username">root</prop>
        </props>
    </property>
</bean>

 

    

原文地址:https://www.cnblogs.com/xb1223/p/10154895.html