- 属性注入 : 通过setter方法给属性设值
① 创建bean类 并 声明 bean
注意: 用这种方式必须要给出无参数构造//省去 bean类创建
//定义一个名 为 userDao的bean
<bean name="userDao" class="cn.jbit.demo.dao.impl.UserDaoImpl" />
②在需要注入的类中定义 属性 并至少 给出 setter方法public class UserBizImpl implements IUserBiz(){
// 注入属性
private IUserDao userDao;// 注入属性 的 setter
public void setUserDao(IUserDao userDao){
this.userDao=userDao;
}
// 方法略
}
③在xml中进行注入//方式一 用<property /> 将 userDao注入到 userBiz
<bean name="userBiz" class="cn.jbit.demo.biz.impl.UserBizImpl">
<property name="userDao" ref="userDao" />
</bean>
//方式二 用p命名空间方式 将 userDao 注入到 userBiz
<bean name="userBiz" class="cn.jbit.demo.biz.impl.UserBizImpl" p:userDao-ref="userDao" />
- 构造注入 : 通过带参构造方法给属性设值
①创建要注入的bean类 , 并在配置文件中声明bean对象//省去类的创建
//声明一个userDao bean对象
<bean name="userDao" class="cn.jbit.demo.dao.impl.UserDaoImpl" />
②创建要被注入的类 并给出 所需的 构造器public class UserBizImpl implements IUserBiz(){
// 注入属性
private IUserDao userDao;
// 注入属性 的 构造方法
public UserBizImpl(IUserDao userDao){
this.userDao=userDao
}
// 方法略
}
③在配置文件中进行注入<bean name="userBiz" class="cn.jbit.demo.biz.impl.UserBizImpl" />
<constructor-arg> <!-- 注入userDao -->
<ref bean="userDao" />
</constructor-arg><!-- 如果有多个参数 用 <constructor-arg index="1" value="8" /> index:参数位置 value:值类型 , ref:引及型 -->
</bean>
- 反射注入 : 通过反射的方式给属性设值
① 声明Bean : Spring的IoC组件
@Repository:持久层组件,用于标注数据访问层组件,如DAO层组件。
@Service:服务成组件,用于标注业务层组件,如Service层组件;会根据Bean的类型实例化一个首字母为小写的bean的实例,如果要修改bean name可以在@Service("custome beanName")。
@Controller:用于标注控制层主键,如Strust的Action层组件。
@Component:泛指组件,当组件不好归类的时候可以用这个标注。// 定义一个名为userDao的bean
@Component("userDao")
public class UserDao implements IUserDao(){
// 方法 略
}
② 装配 : 通过注解的方式对Bean的自动注入
@Autowired :是通过"byType"的方式对Bean属性进行自动注入的,如果Bean属性的类型有多个,那么就添加 @Qualifier("beanName") 加以区分。
//声明一个 名为 userBizImpl的 bean
@Service
public class UserBizImpl implements IUserBiz(){
// 注入名为 userDao 的bean
@Autowired
@Qualifier("userDao")
private IUserDao userDao;
// 方法略
}
@Resource:是通过"byType"的方式对Bean属性进行自动注入的,如果Bean属性的类型有多个,那么就用@Resource("beanName") , @Resource("beanName") 是通过"byName"的方式对Bean属性进行自动注入的。
//声明一个 名为 userBiz的 bean
@Service
public class UserBiz implements IUserBiz(){
// 注入类型为 IUserDao 的bean
@Resource
private IUserDao userDao;//注入name 为 userName 的bean;
@Resource("userName")
private IUserDao userDao1;
// 方法略
} - 接口注入 : 在spring中被废弃,ejb中有用
- autowire= "byName" :通过Bean的名字对属性进行值注入
- autowire="byType":通过属性的类型来对属性进行值注入。<慎用>
- autowire="constructor":通过构造器来对属性进行值注入。<慎用>
- autowire="autodetect":容器自动对属性进行值注入,先用constructor的方式,如果没有构造器,再用byType的方式。<尽量不用>
Spring Bean的应用范围
scope="singleton":单例(默认),对所有应用都只生成一个实例
scope="prototype":对每个应用都生成一个实例
scope="request":在web应用中有效,对每个请求都生成一个实例
scope="session":在web应用中有效,对每个会话都生成一个实例
scope="global-session":在web应用中有效,全局Http会话