springIOC声明Bean的方式

  • 属性声明
<bean id="student" class="com.atguigu.spring.bean.Student">
    <property name="id" value="1"/>
    <property name="name"  value="zhangsan"/>
    <property name="age" value="22"/>
</bean>
  • 构造器声明
<!-- index为参数的顺序 -->
<bean id="book3" class="com.atguigu.spring.bean.Book">
	<constructor-arg value="2" type="java.lang.Integer" index="0"/>
	<constructor-arg value="红楼梦" index="1"/>
	<constructor-arg value="100.8" type="double" index="2"/>                
</bean>
  • P名称空间
<bean id="book4" class="com.atguigu.spring.bean.Book" p:bookid="1" p:bookName="xxx" p:price="22.2"/>
  • Bean之间的依赖引用
<bean id="userService" class="com.atguigu.spring.component.UserService">

    <property name="userDao" ref="userDao"/>

</bean>

<bean id="userDao" class="com.atguigu.spring.component.UserDao"></bean>
  • 内部bean
<bean id="userService2" class="com.atguigu.spring.component.UserService">

    <property name="userDao">
    
            <!-- 内部bean对象,主要就是给当前属性赋值;其他bean无法使用,所以也就不需要定义id -->

            <bean class="com.atguigu.spring.component.UserDao"></bean>

    </property>

</bean>
  • 集合属性注入
<bean id="bookShop" class="com.atguigu.spring.bean.BookShop">
	<!-- 使用List类型的集合属性 -->
    <property name="bookList">
		<list>
			<ref bean="book"/>
			<ref bean="book2"/>
			<ref bean="book3"/>
		</list>
	</property>

    <!-- 使用Map类型的集合属性 -->
	<property name="bookMap">
		<map>
			<entry key="101" value-ref="book"/>
			<entry key="102" value-ref="book2"/>
			<entry key="103" value-ref="book3"/>
		</map>
	</property>

	<!-- 使用prop子元素为Properties类型的属性赋值 -->
	<property name="properties">
		<props>
			<prop key="username">root</prop>
			<prop key="password">123</prop>
		</props>
	</property>
</bean>
  • util名称空间
<!-- 通过util名称空间创建集合类型的bean -->
<util:list id="bookList">
    <ref bean="book"/>
    <ref bean="book2"/>
    <ref bean="book3"/>
</util:list>
  • 级联属性赋值
<bean id="bookShop3" class="com.atguigu.spring.bean.BookShop">
    <property name="book" ref="book"/>
    <property name="book.bookName" value="三国演义后传"/>
</bean>
  • factoryBean工厂
//框架提供了FactoryBean接口,支持项目功能扩展.
//框架利用FactoryBean接口的实现类,来集成第三方框架.
public class MyBookFactoryBean implements FactoryBean<Book> {

	@Override
	public Book getObject() throws Exception {                
		return new Book(111,"XXX",33.3);
	}

	@Override
	public Class<?> getObjectType() {
		return Book.class;
	}

	@Override
	public boolean isSingleton() {
		return true; //true表示单例,false表示多例
	}
}


<bean id="book8" class="com.atguigu.spring.factory.MyBookFactoryBean"></bean>
  • 模板Bean声明
<!--通过继承实现bean配置信息的重用 -->
<bean id="bookTemplate" class="com.atguigu.spring.bean.Book">
    <property name="price" value="22.9"/>
</bean>

<bean id="book9" parent="bookTemplate">
    <property name="bookid" value="222"/>
    <property name="bookName" value="三国演义[2]"/>
</bean>
 
  • Bean的依赖
<!-- bean的创建为根据配置顺序从上到下进行,但是被依赖的优先创建,比如man -->
<bean id="woman" class="com.atguigu.spring.bean.Woman" depends-on="man"></bean>
<bean id="book13" class="com.atguigu.spring.bean.Book"></bean>
<bean id="man" class="com.atguigu.spring.bean.Man"></bean>
  • Bean的作用域
<!-- 如果希望延迟创建对象,可以设置lazy-init="true"; 
但是如果设置了scope="prototype",以及相当于延迟创建对象了,这是再设置lazy-init就不起作用了.-->
<bean id="student" class="com.atguigu.spring.bean.Student" lazy-init="false" scope="prototype"></bean>
  • Bean对象的初始化和销毁方法

<!-- 初始化,销毁方法必须是无参的-->
<!-- 销毁方法,在单例情况下,而且是在关闭IOC容器时才会执行 -->
<bean id="student2" class="com.atguigu.spring.bean.Student" init-method="init" destroy-method="destory" ></bean>
  • properties文件
<!-- 加载外部属性资源文件,加载Spring的运行环境中 -->
<context:property-placeholder location="classpath:/jdbc.properties"/>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="user" value="${jdbc.userName}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="driverClass" value="${jdbc.driverClass}"/>
    <property name="initialPoolSize" value="2"/>
    <property name="minPoolSize" value="5"/>
    <property name="maxPoolSize" value="105"/>
</bean>

  • 基于注解的声明
<!-- 扫描当前包以及所有子包 -->
<context:component-scan base-package="com.atguigu.component"/>

<!-- 包含过滤 -->
<context:component-scan base-package="com.atguigu.component" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    <context:include-filter type="assignable" expression="com.atguigu.component.service.UserService"/>
</context:component-scan>

<!-- 排除过滤-->
<context:component-scan base-package="com.atguigu.component">
     <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>         
     <context:exclude-filter type="assignable" expression="com.atguigu.component.service.UserService"/>
</context:component-scan>
 


  • Autowired注解特别说明

/*

首先根据byType进行装配:

如果只查找到一个,就直接装配;

如果查找到多个,报错:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException:

No qualifying bean of type [com.atguigu.component.service.UserService] is defined:

expected single matching bean but found 2: userServiceImpl,userServiceImpl2

如果多个都希望被注解:

可以采用数组或集合(泛型)进行装配.

根据byType无法确定某一个Bean进行装配时,再根据byName进行装配.

如果根据byType查找到的多个Bean对象的id名称与当前对象的属性名称:

一致,则装配这个一致名称的Bean对象;

不一致,可以借助于@Qualifier来指定其中的某个Bean进行装配.

如果指定的名称在,则装配;

如果指定的名称不在,报错;

如果根据byName也无法装配,采用required=false放弃装配.

 */

@Autowired(required=false)

@Qualifier(value="userServiceImpl3")

另外如果一个接口有多个实现类时,在使用autowired注入时,可以通过泛型的方式去制定需要注入的具体实现类

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值