Spring入门到进阶 - Spring Bean管理 注解方式
Bean的管理
<!--开启注解全局扫描--> <context:component-scan base-package="包名"/>
@Repository("userDao") public class UserDao { public void save(){ System.out.println("DAO中保存用户..."); } }
@Test public void demo1(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userDao.save(); }
使用注解定义Bean
Spring2.5引入使用注解去定义Bean
@Component 描述Spring框架中Bean
除了@Component外,Spring提供了3个基本和@Component等效的注解
@Repository 用于对DAO实现类进行标注
@Service 用于对Service实现类进行标注
@Controller 用于对Controller实现类进行标注
这三个注解是为了让标注类本身的用途清晰,Spring在后续版本会对其增强
属性注入的注解
普通类型:
@Value("...")
对象类型:
使用@Autowired进行自动注入
@Autowired 默认按照类型进行注入
- 如果存在两个相同Bean类型相同,则按照名称注入
- Autowired注入时可以针对成员变量或者set方法
- 通过@Autowired的required属性,设置一定要找到匹配的Bean
- 使用@Qualifier指定注入Bean的名称
Spring提供对JSR-250中定义@Resource标准注解的支持
jdk比较高的版本,引入这个就可以正常使用@Resource注解
@Resource和@Autowired注解功能相似,默认按照名称注入
/* @Autowired @Qualifier("userDao") */ @Resource(name = "userDao")
@Autowired + @Qualifier("userDao") = @Resource(name = "userDao")
Spring的其它注解
生命周期注解
@PostConstruct
初始化
@PreDestroy
单例范围有效(销毁)
@Component("bean1") public class Bean1 { @PostConstruct public void init(){ System.out.println("initBean..."); } public void say(){ System.out.println("say..."); } @PreDestroy public void destory(){ System.out.println("destoryBean..."); } }
@Test public void demo1(){ ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Bean1 bean1 = (Bean1)applicationContext.getBean("bean1"); bean1.say(); applicationContext.close(); }
运行结果:
initBean... say... destoryBean...
范围注解:
@Scope注解用于指定Bean的作用范围
@Component("bean2") @Scope("prototype") // 默认单例,这里设置为多例 public class Bean2 { }
@Test public void demo2() { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Bean2 bean1 = (Bean2)applicationContext.getBean("bean2"); Bean2 bean2 = (Bean2)applicationContext.getBean("bean2"); System.out.println(bean1 == bean2); // false }
传统XM配置和注解配置混合使用
- XML方式的优势
- 结构清晰,易于阅读
- 注解方式的优势
- 开发便捷,属性注入方便
- XML与注解的整合开发
- 1、引入context命名空间
- 2、在配置文件中添加context:annotation-config标签
<context:component-scan base-package="....">
包中所有的注解都被解析<context:annotation-config>
只解析属性的注解
实例:
<context:annotation-config/> <bean id="productService" class="com.imooc.demo3.ProductService"> <!-- <property name="productDao" ref="productDao"/> <property name="categoryDao" ref="categoryDao"/>--> </bean> <bean id="productDao" class="com.imooc.demo3.ProductDao"/> <bean id="categoryDao" class="com.imooc.demo3.CategoryDao"/>
public class ProductService { @Resource(name = "categoryDao") private CategoryDao categoryDao; @Resource(name = "productDao") private ProductDao productDao; /* public void setCategoryDao(CategoryDao categoryDao) { this.categoryDao = categoryDao; } public void setProductDao(ProductDao productDao) { this.productDao = productDao; }*/ public void save() { System.out.println("ProductService的save方法执行了..."); categoryDao.save(); productDao.save(); } }
public class ProductDao { public void save(){ System.out.println("ProductDao的save方法执行了..."); } }
public class CategoryDao { public void save(){ System.out.println("CategoryDao中的save方法执行了..."); } }
@Test public void demo1() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); ProductService productService = (ProductService) applicationContext.getBean("productService"); productService.save(); }
ProductService的save方法执行了...
CategoryDao中的save方法执行了...
ProductDao的save方法执行了...