spring IoC容器概念说明


控制反转(Inverse of Control,IoC)和依赖注入(Dependency Injection)是Spring中一个重要设计思想,控制指对象创建的控制,反转指将对象创建控制权转交给了IoC容器。依赖注入指对已经注册到IoC容器中的bean对象,在bean对象的地方,IoC主动将容器中创建好对象赋值该对象。IoC容器底层通过一个Map所有注册bean对象,key类型是String,存储注入类的全限定名,value类型是Object类型,存储所有类实例化对象,使用反射技术将所有注册bean加载到IoC容器中。

bean注册方式

第一种:xml方式

需要将需要注入的bean配置在xml文件中。

<!--数据库连接配置文件-->
    <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/aop_database?useUnicode=true&amp;characterEncoding=utf8"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
    </bean>

第二种:注解方式

第一步:在将要注册的对象上面使用@Component 、@Resource @Controller @Service任意一种,四个注解的作用都是向IoC容器中注入bean,从源码实现上来说,后三者只是@Component的一个别名。

在这里插入图片描述

第二步:在xml配置文件中配置要扫描的包,spring在启动时会将所有标注了第一步中四个注解的类注入到IOC容器中。

<!-- 批量注入,方式类上面写了 @Component @Resoitory @Service @Controller的类都会被注入ioc容器-->
    <context:component-scan base-package="com.noodles"></context:component-scan>

第三种:@Bean注解

@Bean
public Connection getConnection(DataSource dataSource){
   return  dataSource.getConnection();
}

小结:对自定义类一般使用第二种通过注解的方式,实现也简单;对于三方库对象一般使用第一种配置xml和@Bean注解方式注册对象。

bean注入方式

通过ApplicationContext主动获取bean对象,不属于依赖注入。

 ApplicationContext *applicationContext* = new FileSystemXmlApplicationContext("classpath:beans.xml");
 userService= applicationContext.getBean("userservice",UserService.class);

spring 的IOC和核心功能时在依赖对象的地方,能够实现将IoC容器中创建好的对象引用赋值给依赖对象,常用对象注入的方式由三种

第一种:注解方式

@Autowired @Resource

AutowiredResource
不同点1spring2.5之后引入注解JDK原生注解
不同点2只能根据type实现匹配注入,可以结合@Qualifer按照名字进行注入根据名字、类型次序进行注解,默认先按照名字注入。

@Autowired的缺点,本身属于spring框架注解,和spring强耦合。

第二种:setter方法注入

UserServiceImpl依赖UserDao的实现对象,第一步在xml文件中配置UserServiceImpl的bean,同时使用property指明要注入的对象,第二部对指明的对象设置setter方法,注意保持property中id和setter方法名字一致,属性字段名不强制保证一致。

<bean id="userService" class="com.noodles.service.UserServiceImpl">
    <property name="userService" ref="userDao"></property>
</bean>

UserServiceImpl类
private UserDao userDao;
public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
}

第三种:通过构造函数注入

第一步:在注入类中创建一个含参的构造函数,参数为要注入对象。第二步在xml文件中通过constructor-arg对注入参数进行配置。

<bean id="userService" class="com.noodles.service.impl.UserServiceImpl">
    <constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>

UserServiceImpl类
private UserDao userDao;
public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
}

bean的两种状态

无状态bean:不能保存数据,类中不含有实例变量,是线程安全,一般为了减少频繁创建和销毁bean的资源消耗,会设置成单例模式。

有状态bean:可以保存数据,类中含有实例变量,线程不安全的,为了保证线程安全,会设置成多例模式。

通过设置bean的scope属性选择单例还是多例,scope =”singlton”是单例模式,每次从容器中获取的都是同一个对象,也是默认方式。scope=“prototype”多例模式,每次等价new一个对象。

bean两种加载方式

对于单例模式,懒加载是在第一次实例化对象时才会创建bean对象,同时将创建好的bean对象放在IOC容器中;饿汉模式,时在初始化IOC容器时,便创建对象。对于多例模式只对懒汉模式生效,每次创建的对象都是临时创建的。通过beans 标签属性中的default-lazy-init=“【true|false】”可以选择是懒汉模式加载还是饿汉模式加载。
在这里插入图片描述
Reference:https://www.bilibili.com/video/BV1mE411X7yp?p=160

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值