Spring IOC容器装配Bean_基于注解配置方式
bean的实例化
1.导入jar包(必不可少的)
2.实例化bean
- applicationContext.xml(xml的写法)
<bean id="userDao" class="com.igeekhome.dao.impl.UserDao"></bean>
- 注解的写法
第一种:在 applicationContext.xml中开启注解扫描(同时引入context命名空间)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!--开启注解扫描 context:component-scan 配置spring ioc容器开启注解扫描,扫描指定包下的@Component修饰的类,将这些类的对象创建交给spring ioc容器完成 base-package: 需要扫描哪些包(及其子包) --> <context:component-scan base-package="com.igeekhome"></context:component-scan> </beans>
第二种:@Component、@Service、@Controller、@Repository 用于实例化bean
Spring3.0为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理
@Service、@Controller、@Repository是@Component衍生的子注解
- @Repository用于标注数据访问组件(如DAO层组件)
- @Service用于标注业务层组件(如Service层)
- @Controller用于标注控制层组件(如struts中的action层)
- @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
/* 注解:添加在实现类上(思想同配置文件) @Component 等价于 <bean id="userDaoImpl" class="com.igeekhome.dao.impl.UserDaoImpl"></bean> id:默认是类名(首字母小写) value:bean的id @Component(value = "userDao") @Component("userDao") */ @Repository("userDao") public class UserDaoImpl implements IUserDao { public void select() { System.out.println("UserDao...select..."); } }
bean属性的依赖注入
简单数据类型依赖注入
Spring3.0后,提供 @Value注解,可以完成简单数据的注入
/* @Component @Component(value="customerService") @Service(value="customerService") 四者都等价 */ @Service("customerService") public class CustomerService { //简单类型的成员变量 @Value("Rose")//参数的值简单类型 private String name="Jack"; //保存业务方法 public void save(){ System.out.println("CustomerService业务层被调用了。。。"); System.out.println("name:"+name); } }
复杂类型数据依赖注入
1.使用@Value 结合SpEL -- spring3.0 后用
@Service("userService") public class UserServiceImpl implements IUserService { /*<bean id="userDao" class="com.igeekhome.dao.impl.UserDao"> </bean> @Value("#{bean的id}") */ //写法一 (在属性声明上面注入,底层自动还是生成setUserDao()) @Value("#{userDao}") private UserDaoImpl userDao; //写法二 @Value("#{userDao}") public void setUserDao(UserDaoImpl userDao) { this.userDao = userDao; } public void list() { System.out.println("UserServiceImpl...list..."); userDao.select(); } }
2.使用@Autowired 结合 @Qualifier
@Autowired:可以单独使用,如果单独使用,按照类型进行注入(会在spring ioc容器中查找类型为com.igeekhome.dao.impl.UserDaoImpl的bean并进行注入,如果找不到,肯定注入失败;如果找到匹配的单个bean,则注入成功; 如果找到多个相同类型的bean,则会选择其中一个bean进行注入
@Qualifier:与@Autowired结合,按照名称进行注入
@Autowired//默认按照类型注入的 @Qualifier("userDao")//必须配合@Autowired注解使用,根据名字注入 private UserDaoImpl userDao;
3.JSR-250标准(基于jdk) 提供注解@Resource
如果没有指定name属性,那么先按照名称(注解修饰的属性名)进行注入,在容器中查找bean的name/id为userDao的bean,如果找到,则注入成功。如果按照名称进行注入没有找到相对应的bean,那么就会使用按照类型进行装配,如果没有改类型,则注入失败,抛出异常;如果容器中存在单个该类型的bean,则注入成功;如果容器中存在多个相同类型bean,则注入失败(expected single matching bean but found 2: userDaoxxx,userDaox)
如果指定了name属性,那么就只会按照name进行注入
@Resource//(name="userDao") private UserDaoImpl userDao;
4.JSR-330标准(jdk) 提供 @Inject和@Named注解(不推荐)
需要先导入 javax.inject 的 jar
使用@Inject,默认按照类型注入,使用@inject和@Named注解,则按照名称注入。用法与@Autowired 结合 @Qualifier 的用法一致
bean的初始化和销毁
1.applicationContext.xml 中的写法
<!-- init-method:指定初始化方法 destroy-method: 指定销毁触发方法 --> <bean id="lifecycle" class="com.igeekhome.bean.LifeCycleBean" scope="singleton" init-method="initMethod" destroy-method="destroyMethod"></bean>
2.注解写法
使用 @PostConstruct 注解, 标明初始化方法 ---相当于 init-method 指定初始化方法
使用 @PreDestroy 注解, 标明销毁方法 ----相当于 destroy-method 指定对象销毁方法
@Repository("userDao") public class UserDaoImpl implements IUserDao { public void select() { System.out.println("UserDao...select..."); } //init-method @PostConstruct public void init() { System.out.println("init..."); } //destory-method @PreDestroy public void destory() { System.out.println("destory"); } }
bean的作用域
1.applicationContext.xml 中的写法
默认是 singleton 单例 ,prototype是多例
<bean id=”” class=”” scope=”prototype”>
2.注解写法
通过@Scope注解,指定Bean的作用域
@Service("userService") //@Scope("singleton")默认是单列 @Scope("prototype") public class UserServiceImpl implements IUserService { }
备注
只有在Spring配置文件中开启了注解扫描
才能使用 @Component @Autowired @Resource @PostConstruct @PreDestroy等注解
- Spring(三):IoC容器装配Bean(xml配置方式和注解方式)
- IoC容器装配Bean_基于注解配置方式
- 3.IoC容器装配Bean_基于XML配置方式
- [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)
- 【Java.Spring.Core】【IoC】基于注解的Bean装配(非XML配置)
- Spring学习-06:IOC容器装配Bean(xml配置方式)详解
- 第36天(就业班) spring引入、专业术语、spring六大模块、bean创建对象的细节、IOC容器、对象依赖关系、自动装配、注解方式
- JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试
- servlet调用spring容器中的bean,的两种方式一种注解一种xml配置
- Spring中Bean的配置:基于注解的方式
- servlet调用spring容器中的bean,的两种方式一种注解一种xml配置
- 04-Spring-使用ioc注解方式配置bean
- Spring_IOC注解方式装配Bean对象
- Spring(二)基于注解的方式配置Bean
- Spring IOC之基于注解的容器配置
- 【Spring】IOC之基于注解的配置bean(上)
- IOC容器装配Bean的四种方法(xm配置方式l)
- spring、IoC控制反转和DI依赖注入入门、基于XML的Bean装配、基于注解的Bean装配
- 在IoC容器中装配Bean(基于XML配置)
- 05_IOC容器装配Bean(注解方式)