Spring-bean(一)

  配置形式:基于xml文件的方式;基于注解的方式

  Bean的配置方式:通过全类名(反射),通过工厂方法(静态工厂方法&实例工厂方法),FactoryBean

  依赖注入的方式:属性注入,构造器注入

一   属性注入

1. Person.java

 1 public class Person{
 2     String name;
 3
 4     public void setName(String name) {
 5         this.name = name;
 6     }
 7     public void hello() {
 8         System.out.println("hello" + name);
 9     }
10
11     public Person(String name) {
12         super();
13         this.name = name;
14     }
15     @Override
16     public String toString() {
17         return "Person[name=" + name + "]";
18     }
19
20 }

Main.java

1  public class Main {
2       public static void main(String[] args) {
3           Person person= new Person();
4           person.setName("wenxl");
5           person.hello();
6     }
7 }        

要调用person.hello(),需要先实例化一个Person对象,而在引入spring后,只需要在ApplicationContext.xml中定义一个bean,则在main方法中,只需要通过ByType或ByName方式,即可获得Person对象。配置如下,其中property属性是为person设置初始值,name为对应的成员变量,value为对应值

ApplicationContext.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 5
 6     <!-- 属性注入 -->
 7     <bean id="person" class="com.text.Person">
 8         <property name="name" value="wenxl"></property>
 9     </bean>
10
11 </beans>
 1 public class Main {
 2     public static void main(String[] args) {
 3         //1. 创建spring的ioc容器对象
 4         //applicationContext代表ioc容器
 5         //ClassPathXmlApplicationContext代表ac接口的实现类,用于加载配置
 6         ApplicationContext atx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
 7
 8         //2. 从ioc容器中获取bean实例
 9
10         //利用类型返回ioc容器中的bean,但要求ioc容器中只有一个该类型的bean
11         Person person = atx.getBean(Person.class);
12         //根据id获取ioc容器中的bean
13         Person person2 = (Person) atx.getBean("person");
14
15         person.hello();
16         person2.hello();
17     }
18 }

二   构造器注入

引入Car类

public class Car {
    String name;
    int speed;
    int price;
    public void setName(String name) {
        this.name = name;
    }
    public void setSpeed(int speed) {
        this.speed = speed;
    }
    public void setPrice(int price) {
        this.price = price;
    }

    public Car(String name, int speed, int price) {
        this.name = name;
        this.speed = speed;
        this.price = price;
    }
}

如下,则将按照name,speed,price的顺序,分别设置值Baoma,123,123

1 <bean id="car" class="com.text.Car">
2     <constructor-arg value="Baoma"></constructor-arg>
3     <constructor-arg value="123"></constructor-arg>
4     <constructor-arg value="123"></constructor-arg>
5 </bean>

当然,也可以自行设置顺序

1 <bean id="car" class="com.text.Car">
2     <constructor-arg index="0" value="Baoma"></constructor-arg>
3     <constructor-arg index="1" value="123"></constructor-arg>
4     <constructor-arg index="2" value="123"></constructor-arg>
5 </bean>

还可以采用type来表示对应的数据类型进而相互匹配,如将price改为double类型,则

1 <bean id="car" class="com.text.Car">
2     <constructor-arg type="java.lang.String" value="Baoma"></constructor-arg>
3     <constructor-arg type="int" value="123"></constructor-arg>
4     <constructor-arg type="double" value="123"></constructor-arg>
5 </bean>

当包含<等特殊字符时,可用CDATA包裹。

1 <bean id="car" class="com.text.Car">
2     <constructor-arg type="java.lang.String" >
3         <value><![CDATA[<audi>]]></value>
4     </constructor-arg>
5     <constructor-arg type="int" value="123"></constructor-arg>
6     <constructor-arg type="double" value="123"></constructor-arg>
7 </bean>

当需要在bean中引用另外一个bean时,采用ref或内部bean(不可被外部引用),在person类中,增加一个car对象

 1     <bean id="person" class="com.text.Person">
 2         <property name="name" value="Tom"></property>
 3         <!--
 4         <property name="car">
 5             <ref bean="car" />
 6         </property>
 7         -->
 8         <!--
 9         <property name="car" ref="car"></property>
10          -->
11         <property name="car">
12             <bean class="com.text.Car">
13                 <constructor-arg value="Ford"></constructor-arg>
14                 <constructor-arg value="50"></constructor-arg>
15                 <constructor-arg value="5000" type="double"></constructor-arg>
16             </bean>
17         </property>
18     </bean>

级联属性

1     <bean id="person" class="com.text.Person">
2         <constructor-arg value="lili"></constructor-arg>
3         <constructor-arg ref="car"></constructor-arg>
4         <property name="car.price" value="10000"></property>
5     </bean>

当Person类中新增的为List<car>,此时,property改为

1 <property name="car">
2     <list>
3         <ref bean="car" />
4         <ref bean="car2"/>
5     </list>
6 </property>

当Person类中新增的为Map<String, car>,则property改为

1 <property name="car">
2     <map>
3        <entry key="aa" value-ref="car" ></entry>
4        <entry key="bb" value-ref="car2"></entry>
5     </map>
6 </property>

使用props和prop子节点来为properties属性赋值

引入DataSource类

 1 public class DataSource {
 2     Properties properties;
 3
 4     public Properties getProperties() {
 5         return properties;
 6     }
 7
 8     public void setProperties(Properties properties) {
 9         this.properties = properties;
10     }
11
12     @Override
13     public String toString() {
14         return "DataSource [properties=" + properties + "]";
15     }
16
17 }
 1     <bean id="dataSource" class="com.text.DataSource">
 2         <property name="properties">
 3             <props>
 4                 <prop key="user">root</prop>
 5                 <prop key="password">123456</prop>
 6                 <prop key="jdbcUrl">jdbc:mysql:///test</prop>
 7                 <prop key="driverClass">com.mysql.jdbc.Driver</prop>
 8             </props>
 9         </property>
10     </bean>
时间: 2024-10-19 17:22:29

Spring-bean(一)的相关文章

Spring - Bean Definition Inheritance

A bean definition can contain a lot of configuration information, including constructor arguments, property values, and container-specific information such as initialization method, static factory method name, and so on. A child bean definition inher

Spring点滴四:Spring Bean生命周期

Spring Bean 生命周期示意图: 了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程. --------------------------------------------------------------------------------------------------------------------------------------------------- spring-service.xml: <?xml version=

非spring组件servlet、filter、interceptor中注入spring bean

问题:在filter和interceptor中经常需要调用Spring的bean,filter也是配置在web.xml中的,请问一下这样调用的话,filter中调用Spring的某个bean,这个bean一定存在吗?现在总是担心filter调用bean的时候,bean还没被实例化? 答案:因为spring bean.filter.interceptor加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出

Spring Bean

一.Spring的几大模块:Data access & Integration.Transcation.Instrumentation.Core Spring Container.Testing. 二.Spring Bean 2.1.声明Bean a.简单的bean装配方式 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework

AspectJ切面具体是什么时候实例化的?实在Spring Bean之前还是之后?

问题出于<Spring In Action>中4.5节 注入AspectJ切面时,看的不是太懂! 不懂得地方是:    AspectJ切面中需要注入Spring的Bean,那么AspectJ切面具体是什么时候实例化的?是在Spring Bean之前还是之后?

Spring 中 ApplicationContext 和 BeanFactory 的区别,以及 Spring bean 作用域

//从ApplicationContext 中取 bean ApplicationContext ac = new ClassPathXmlApplicationContext ( "com/hsp/beans.xml" ) ; ac.getBean("beanId"); 当我们去实例化beans.xml,该文件中配置的 bean 就被实例化(不论你用还是不用,bean对象都在那),而且该对象是singleton单例的.(每个bean都有scope属性,可以人为的设

Spring Bean 注册方式小结

IOC容器 Spring的核心是一个IOC容器,管理着我们向容器注册的所有bean.下面我们来看下两种向容器注册bean的方式, 通过BeanDefinitionReader读取Spring Bean的配置文件,解析然后注册: 通过ClassPathBeanDefinitionScanner直接扫描带有Spring Bean注解的Java类并注册: Reader BeanDefinitionReader的使用方式如下, import org.springframework.beans.facto

Spring Bean的生命周期

Bean的初始化过程已经被Spring完全包装起来了,无法人工干预. Spring预留了两个回调方法的入口 回调方法:定义出来完成一定的功能,提供给回调者/服务器/上层容器调用的方法,叫做回调方法. Bean类 public class Bean1 { public Bean1() { //System.out.println("bean1...构造方法"); } public void show(){ System.out.println("bean1...方法"

Spring bean的作用域

1.介绍 Spring bean定义时,实际上是创建类实例的配方,这意味着,通过这个配方,即可创建该类的很多对象.Spring框架支持的5种作用域: 2.单例作用域介绍 单例作用域为默认的作用域,单例bean只会产生一个该bean对应的类型的实例对象,对于所有的请求,Spring容器都只会返回一个实例.这个实例被存储在Spring容器的单例池缓存中,之后所有对该bean对象的请求和引用,都将从该单例缓存池中取,而不是再生成新的对象. 但是,需要注意的点是该单例缓存并不是我们之前在设计模式中所了解

Spring Bean的作用域(转)

Spring Bean的作用域 .singleton  [单例] eg:<bean id="personService" class="com.yinger.service.impl.PersonServiceBean" scope="singleton"></bean> 在每个Spring IoC容器中一个bean定义只有一个对象实例. 请注意Spring的singleton bean概念与“四人帮”(GoF)模式一书中