春IOC Beanがインスタンス化を登録しました

サインアップしてBeanをインスタンス化

通常、管理対象Beanの登録とインスタンスを定義することによって、リソースディレクトリ内のBeanの構成メタデータ属性として始まるXMLアプリケーションで作成されました。

セット方法

<!-- 一个bean标签就表示一个对象, id:这个对象的唯一标识, name:类似别名, class:注册对象的完全限定名 -->
<!-- 使用setter注入,绑定方法名setXXX,name属性值必须与XXX一致,并且setter方法必须为public -->
<!-- 通过setter注入,实际是通过反射调用类的无参构造,所以在显示为类定义构造方法的时候不要忘记添加一个无参构造 -->
<bean id="person1" name="person" class="com.nanborone.bean.Person">
    <!-- 使用property标签给对象的属性赋值, name:表示属性的名称, value:表示属性的值 -->
    <property name="id" value="1"/>
    <property name="name" value="nanborone"/>
    <property name="male" value="true"/>
</bean>

コンストラクタ

<!-- 使用constructor注入,绑定构造方法形参名XXX,name属性值必须与XXX一致 -->
<!-- constructor-arg个数必须与已有的构造器参数个数相同 -->
<bean id="person2" class="com.nanborone.bean.Person">
	<!-- 使用constructor-arg标签在对象构造的时候给属性赋值, name:表示属性的名称, value:表示属性的值 -->
	<!-- 在使用构造器赋值的时候可以省略name属性,但是此时就要求必须严格按照构造器参数的顺序来填写了 -->
	<!-- 如果name属性省略且有相同参数个数的构造器,后定义的会覆盖先定义的除非指定type来匹配确定的构造器 -->
    <constructor-arg name="id" value="2"/>
    <constructor-arg name="name" value="nanborone"/>
    <constructor-arg name="male" value="true"/>
</bean>
<bean id="person3" class="com.nanborone.bean.Person">
	<!-- 如果想不按照顺序来添加参数值,那么可以搭配index属性来使用 -->
    <constructor-arg value="3"/>
    <constructor-arg value="true" index="2"/>
    <constructor-arg value="nanborone" index="1"/>
</bean>
<bean id="person4" class="com.nanborone.bean.Person">
	<!-- 可以使用type属性来指定类型,但是无法自动拆装箱,可以用type="int" -->
    <constructor-arg value="4" type="int"/>
    <constructor-arg value="nanborone" type="java.lang.String"/>
    <constructor-arg value="true" index="2"/>
</bean>

春の文字列は、Javaは組み込み型のデフォルトに変換することができます。例えばintlongStringbooleanなど、StringToXXXConverterスルー。

通常、我々だけではない混乱プラス財産の残りを行い、基本的には、注入法、最も簡単なコンストラクタ・インジェクションは、時折使う属性最も単純なを使用しています。

ファクトリパターン

前のケースでは、ビーンは、ファクトリ・オブジェクト・モデルによって作成され、すべてのオブジェクトが、実際には、春にさらに例の別のBean作成方法を含み、反射対応するBeanインスタンスによって得られる作ります。

<!-- 静态工厂:不需要创建工厂类实例,通过类方法(静态方法)来获得bean -->
<!-- class:指定静态工厂类, factory-method:指定哪个方法是工厂方法 -->
<bean id="person1" class="com.nanborone.bean.factory.PersonStaticFactory" factory-method="getInstance">
    <!--constructor-arg:可以为方法指定参数-->
    <constructor-arg value="nanborone" />
</bean>

<!-- 实例工厂:需要先创建工厂类实例,再通过实例调用实例方法来获得bean-->
<bean id="personInstanceFactory" class="com.nanborone.bean.factory.PersonInstanceFactory" />
<!-- factory-bean:指定使用哪个工厂实例, factory-method:指定使用哪个工厂实例的方法 -->
<bean id="person2" class="com.nanborone.bean.Person" factory-bean="personInstanceFactory" factory-method="getInstance">
    <constructor-arg value="nanborone" />
</bean>

ファクトリクラスの対応する静的ファクトリクラスとインスタンスを作成します:

public class PersonStaticFactory {
    public static Person getInstance(String name) {
        return new Person(1, name, true);
    }
}
public class PersonInstanceFactory {
    public Person getInstance(String name) {
        return new Person(1, name, true);
    }
}

FactoryBeanの

FactoryBeanのインターフェイスであり、春、春に指定されたインターフェースの実装クラスが使用され、それは単一のケースではないかどうか、オブジェクトが作成された場合にのみ、工場とし​​て使用されるが、起動時にIoCコンテナのインスタンスを作成しません。

<bean id="myFactoryBean" class="com.nanborone.bean.factorybean.MyFactoryBean" />

MyFactoryBeanカテゴリの作成:

public class MyFactoryBean implements FactoryBean<Person> {

	// 工厂方法,返回需要创建的对象
    @Override
    public Person getObject() throws Exception {
        System.out.println("通过MyFactoryBean创建");
        return new Person(1, "nanborone, true);
    }

    // 返回创建对象的类型,spring会自动调用该方法返回对象的类型
    @Override
    public Class<?> getObjectType() {
        return Person.class;
    }

    // 创建的对象是否是单例对象
    @Override
    public boolean isSingleton() {
        return false;
    }
}

人のインスタンスを取得する必要性によって試験したとき、myFactoryBean

public class IocTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        Person person = context.getBean("myfactorybean", Person.class);
        System.out.println(person);
    }
}

公開された13元の記事 ウォンの賞賛0 ビュー334

おすすめ

転載: blog.csdn.net/weixin_44601009/article/details/104309975