什么是Spring Bean?
由Spring框架创建并管理的对象称为bean对象,bean是一个由Spring IoC容器实例化、组装和管理的对象。
Bean管理的方式
Spring的基本Bean管理包括Bean配置,Bean实例化,Bean的依赖注入。
基于xml配置方式
在spring框架xml配置文件中,配置并管理bean对象。
bean标签中属性介绍:
●id:bean的唯一标识符;
●name:bean对象的别名,可以为多个;
●class:bean的实现类的全类名;
●scope:设置bean实例的作用域,该属性有两个值:
①scope=“singleton” 默认值 ,单例的,在整个应用程序中只创建一个对象,在spring框架启动时就创建好了;
②scope=“prototype” 原型的 每次获取时创建一个对象 可以创建多个。
●property:bean标签的子标签,用于调用实体类中的setter()方法完成属性赋值;
●constructor-arg:bean标签的子标签,可以使用该标签传入构造参数进行实例化;
●value:用于直接给定一个常量;
●ref:用于指定某个bean实例的引用;
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置需要让Spring进行管理的类-->
<bean id="admin" name="admin1" class="Admin全类名">
<!--通过get,set方法注入时,类中必须要有该方法-->
<property name="id" value="10"></property>
<property name="account" value="admin"></property>
<!--通过构造方法注入时,类中必须要有对应的构造方法-->
<constructor-arg name="id" value="10"></constructor-arg>
<constructor-arg name="account" value="admin"></constructor-arg>
</bean>
<bean name="adminDao" class="AdminDao全类名"></bean>
<bean name="adminService" class="AdminService全类名">
<property name="adminDao" ref="adminDao"></property><!--注入-->
</bean>
</beans>
注解方式
1.使用注解前的配置:
①导入注解所需要的jar包;
Spring的注解功能封装在aop包中,我们只需要导入Spring aop jar包即可,由于新版Spring jar包自动导入,此处我们无需再手动导入。
②开启注解扫描;
在spring配置文件中开启注解扫描:
<!--开启注解扫描-->
<context:component-scan base-package="包名"> </context:component-scan>
2.注解标签介绍:
①@Component,一般用于模型类;
import org.springframework.stereotype.Component;
//<bean id="admin" class="Admin全类名">
@Component(value = "admin")
public class Admin {
......
}
②@Service,一般用于service类;
import org.springframework.stereotype.Service;
//<bean name="adminService" class="AdminService全类名">
@Service(value = "adminService")
public class AdminService {
......
}
③@Repository,一般用于dao层;
import org.springframework.stereotype.Repository;
//<bean name="adminDao" class="AdminDao全类名">
@Repository(value = "adminDao")
public class AdminDao {
......
}
④@Scope,标注bean的作用域;
⑤@Autowired,spring框架提供的一个自动注入注解标签,如果写在字段上年,就不需要再写setter方法。默认情况下要求依赖对象必须存在,如果允许null值,可以设置required=false。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service(value = "adminService")
public class AdminService {
@Autowired
AdminDao adminDao;//依赖注入
......
}
那么该标签是如何去查找需要注入的对象呢?
有两种查找方式:
1.byType : 在spring容器中根据类型查找;
2.byName : 通过名称查找 ,需要结合 @Qualifier(value=“名称”),value 属性用于指定要匹配的 Bean 的 id 值。
⑥@Resource
该注解标签功能与@Autowired相同:
1.byType :@Resource;
2.byName :@Resource(name=" "),name用于指定要匹配的 Bean 的 id 值。
但是该标签是JDK中的,Spring提供了对jdk 中@Resource 注解的支持。
以上两种方式对比
1.xml方式:
优点:配置和代码是分离的,在xml文件中做修改,无需编译代码,只需重启服务器即可将新的配置加载;
缺点:编写麻烦,效率低,大型项目过于复杂。
2.注解方式:
优点:方便,直观,高效,代码少;
缺点:以硬编码的方式写入到java代码中,修改是需要重新编译代码的。
依赖注入
在Spring创建对象时,还需要给对象的属性进行初始化赋值,这个过程称为依赖注入(DI Dependency Injection)。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
依赖注入的方式:
1.构造器方法注入:
在bean标签内部使用 constructor-arg标签注入的方式。
<bean id="admin" name="admin1" class="Admin全类名">
<!--通过构造方法注入时,类中必须要有对应的构造方法
一个constructor-arg注入一个参数
构造方法中有几个需要注入的参数就需要几个constructor-arg-->
<constructor-arg name="id" value="10"></constructor-arg>
<constructor-arg name="account" value="admin"></constructor-arg>
</bean>
2.set方法注入:
必须要有一个无参的构造方法,否则只能用构造方法构造。
在bean标签内部使用 constructor-arg标签注入的方式。
<bean id="admin" name="admin1" class="Admin全类名">
<!--通过get,set方法注入时,类中必须要有该方法-->
<property name="id" value="10"></property>
<property name="account" value="admin"></property>
</bean>