Spring注入bean的几种方式以及常用注解

  • 1. 控制反转(IOC)
  • 1.1 依赖注入
  • 1.2 bean创建方式
  • 1.3 DI属性注入
  • 1.3.1 set注入
  • 1.3.2 引用类型的set注入
  • 1.3.3 构造注入
  • 1.3.4 应用类型自动注入
  • 1.4 spring注解
  • 1.4.1 组件扫描器
  • 1.4.2 @Component
  • 1.4.3 @Respository
  • 1.4.4 @Service
  • 1.4.5 @Controller
  • 1.4.6 @Value
  • 1.4.7 @Resource


1. 控制反转(IOC)

定义: 把对象的创建、赋值、管理工作交给外部容器实现,对象的创建通过外部资源实现。

1.1 依赖注入

只需要只提供对象名称即可,对象的创建、赋值、查找都交给spring容器实现

1.2 bean创建方式

<bean id="myTest" class="example.service.MyTest" scope="prototype">

    </bean>

1.3 DI属性注入

1.3.1 set注入
public class MyTest {
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }

    <bean id="myTest" class="example.service.MyTest">
        <property name="name" value="zhangsan"></property>
        //调用MyTest类中的setName方法,name属性可无
    </bean>
1.3.2 引用类型的set注入
<bean id="student" class="example.service.Student">
        <property name="name" value="lisi" />
    </bean>

    <bean id="school" class="example.service.School">
        <property name="name" value="changde" />
        <property name="student" ref="student" />//引用student对象
    </bean>
1.3.3 构造注入
<bean id="student" class="example.service.Student">
        <constructor-arg name="name" value="zhangsan" />
        <constructor-arg name="age" value="123" />
    </bean>
1.3.4 应用类型自动注入
//引用类型的属性名称和spring容器中<bean>的id名称一样,且数据类型一致
    <bean id="school" class="example.service.School" autowire="byName" >
        <property name="name" value="changde" />
    </bean>
    
    //引用类型的数据类型和spring容器中<bean>的class属性是同源关系,同一个bean.xml中,符合byType条件的bean应当只有一个,注入父子类时应当特别注意
    <bean id="school" class="example.service.School" autowire="byType" >
        <property name="name" value="changde" />
    </bean>

1.4 spring注解

1.4.1 组件扫描器
<!--指定多个包的三种方式-->
    <!--第一种:使用多组扫描器-->
    <context:component-scan base-package="example.Controller" />
    <context:component-scan base-package="example.Util" />
    <!--第二种:分隔符(;或,)-->
    <context:component-scan base-package="example.Controller;example.Util" />
    <!--第三种:指定父包-->
    <context:component-scan base-package="example" />
1.4.2 @Component

创建对象,等价于的功能,默认名称小写。

1.4.3 @Respository

放在dao的实现类上,表示创建dao对象,dao对象可访问数据库。

1.4.4 @Service

放在service的实现类上,service对象做业务处理,可以有事务等功能。

1.4.5 @Controller

放在控制器类上,创建控制器对象的,能够接受用户提交的参数,显示请求的处理结果。

1.4.6 @Value

属性赋值,无需set方法,也可用于set方法之上。

@Value("zhangsan")
    private String name;

    @Value("24")
    private int number;

    // 引用类型赋值
    // @Autowired: 通过注解给引用类型赋值,使用自动注入的原理,默认使用byType自动注入
    @Autowired
    private School school;

    // byName自动注入
    @Autowired
    @Qualifier("school") //@Qualifier注解属性值不能为空

    //引用类型是否存在,默认为true,为true时,若引用类型不存在则会抛出异常,bean注入失败
    @Autowired(required = true)

    //设置为false时,若引用类型不存在则为对象为null
    @Autowired(required = false)
1.4.7 @Resource

jdk中的注解,spring框架提供了对这个注解的功能支持,可以使用他给引用类型赋值,使用的也是自动注入的原理,默认是byName,若byName赋值失败,再使用byType。

@Resource
    private School school;

    @Resource(name = "school") // 只使用byName
    private School school;

代码经常改动使用配置文件,不经常改动使用注解,生产效率方式更高,注解为主,配置文件为辅