Spring-IOC(二)

bean的几个概念

1. 两种bean类型

  • 普通bean:配置文件中定义bean类型就是返回类型
  • 工厂bean:配置文件中定义的bean类型和返回类型不一样
//实现接口FactoryBean
public class MyBean implements FactoryBean<Course> {

    //定义返回bean
    @Override
    public Course getObject() throws Exception {
        Course course = new Course();
        course.setCname("abc");
        return course;
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

2. Bean的作用域:scope属性设置单实例还是多实例

  • Singleton:单实例,默认设置,加载spring配置文件时就会加载单实例对象
  • Prototype:多实例,在调用getBean方法时创建多实例对象
  • Reuest
  • Session

3. Bean生命周期:一般bean生命周期五步,bean的后置处理器有七步

  1. 通过构造器创建 bean 实例(无参数构造)
  2. 为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
  3. 把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
  4. 调用 bean 的初始化的方法(需要进行配置初始化的方法)
  5. 把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization
  6. bean 可以使用了(对象获取到了)
  7. 当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
<!--
	init-method:bean初始化执行的方法
	destroy-method:bean销毁时执行的方法
-->
<bean id="orders" class="com.my.spring5.bean.Orders" 
        init-method="initMethod" destroy-method="destroyMethod">
	<property name="oname" value="手机"></property>
</bean>

<!--配置后置处理器-->
<bean id="myBeanPost" class="com.my.spring5.bean.MyBeanPost"></bean>
//自定义后置处理器实现接口BeanPostProcessor 
public class MyBeanPost implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) 
            throws BeansException {
        System.out.println("在初始化之前执行的方法");
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) 
            throws BeansException {
        System.out.println("在初始化之后执行的方法");
        return bean;
    }
}

4. autowire自动装配

  • 根据指定装配规则(属性名称或者属性类型),spring自动将匹配的属性值进行注入
  • 两种装配规则
    • Byname:根据属性名称注入,注入值bean的id值与类属性值名称一样
    • ByType:根据属性类型注入,如果有两个类型一样,id不一样的bean,会报错不知道该注入哪一个
<bean id="emp" class="com.atguigu.spring5.autowire.Emp" autowire="***"></bean>
<bean id="dept" class="com.atguigu.spring5.autowire.Dept"></bean>
<bean id="dept1" class="com.atguigu.spring5.autowire.Dept"></bean>

5. 引入外部属性文件

<!--引入外部属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>

<!--配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
	<property name="driverClassName" value="${prop.driverClass}">
	</property>
	<property name="url" value="${prop.url}"></property>
	<property name="username" value="${prop.userName}"></property>
	<property name="password" value="${prop.password}"></property>
</bean>

注解操作

1. 注解开发需要开启组件扫描

  • 如果扫描多个包,base-package的多个包使用逗号隔开
  • 使用注解时,bean的id默认值是类名称,首字母小写
<!--示例 1
	use-default-filters="false" :
		表示现在不使用默认 filter,自己配置 filter
	context:include-filter ,设置扫描哪些内容
-->
<context:component-scan base-package="com.my" 
		use-defaultfilters="false">
	<context:include-filter type="annotation"
			expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!--示例 2
	context:exclude-filter: 设置哪些内容不进行扫描
-->
<context:component-scan base-package="com.my">
	<context:exclude-filter type="annotation"
		expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

2. 四个注入属性的注解

  • @AutoWired:根据属性类型进行自动装配
  • @Qualifier:根据属性名称进行自动装配,和上面autowired一起使用
  • @Resource:默认是根据类型装配,加入name属性可以指定根据属性名称装配
  • @Value:注入普通属性

3. 完全注解开发实例

//作为配置类,替代xml配置文件
@Configuration  
@ComponentScan(basePackages = {"com.atguigu"})
public class SpringConfig {

}

@Test
public void testService2() {
	//加载配置类
	ApplicationContext context
			= new AnnotationConfigApplicationContext(SpringConfig.class);
	UserService userService = 
            context.getBean("userService", UserService.class);
	System.out.println(userService);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值