7 -- Spring的基本用法 -- 6... Spring 3.0 提供的Java配置管理
7.6 Spring 3.0 提供的Java配置管理
Spring 允许使用Java类进行配置管理,可以不使用XML来管理Bean,以及Bean之间的依赖关系。
Interface :Person
package edu.pri.lime._7_6.bean;public interface Person {void userAxe();}
Interface : Axe
package edu.pri.lime._7_6.bean;public interface Axe {String chop(); }
Class : Chinese
package edu.pri.lime._7_6.bean.impl;import edu.pri.lime._7_6.bean.Axe; import edu.pri.lime._7_6.bean.Person;public class Chinese implements Person {private Axe axe;private String name;public Axe getAxe() {return axe;}public void setAxe(Axe axe) {this.axe = axe;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void userAxe() {System.out.println("我是:" + name + "," + axe.chop());} }
Class : StoneAxe
package edu.pri.lime._7_6.bean.impl;import edu.pri.lime._7_6.bean.Axe;public class StoneAxe implements Axe {public String chop() {return "石斧砍柴真慢";}}
Class : SteelAxe
package edu.pri.lime._7_6.bean.impl;import edu.pri.lime._7_6.bean.Axe;public class SteelAxe implements Axe {public String chop() {return "钢斧砍柴真快";}}
Class : AppConfig
package edu.pri.lime._7_6.bean.configuration;import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;import edu.pri.lime._7_6.bean.Axe; import edu.pri.lime._7_6.bean.Person; import edu.pri.lime._7_6.bean.impl.Chinese; import edu.pri.lime._7_6.bean.impl.SteelAxe; import edu.pri.lime._7_6.bean.impl.StoneAxe;//指定类为配置类 @Configuration public class AppConfig {// 相当于定义一个名为personName的变量,其值为“lime”@Value("lime")String personName; // 配置Bean : stoneAxe@Bean(name="stoneAxe")public Axe stoneAxe(){return new StoneAxe();} // 配置Bean : steelAxe@Bean(name="steelAxe")public Axe steelAxe(){return new SteelAxe();} // 配置一个Bean:chinese@Bean(name="chinese")public Person chinese(){Chinese person = new Chinese();person.setName(personName);person.setAxe(steelAxe());return person;} }
Class :BeanTest
package edu.pri.lime._7_6.main;import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;import edu.pri.lime._7_6.bean.Person; import edu.pri.lime._7_6.bean.configuration.AppConfig; import edu.pri.lime._7_6.bean.impl.Chinese;public class BeanTest {public static void main(String[] args){//使用Java配置类管理Spring容器中的Bean及其依赖关系时,使用AnnotationConfigApplication创建容器ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);Person chinese = ctx.getBean("chinese",Chinese.class);chinese.userAxe();} }
@Configuration : 用于修饰一个Java配置类
@Bean : 用于修饰一个方法,将该方法的返回值定义成容器中的一个Bean。
@Value : 用于修饰以恶搞Field,用于为该Field配置一个值,相当于配置一个变量。
@Import : 修饰一个Java配置类,用于向当前Java配置类中导入其他Java配置类。
@Scope : 用于修饰一个方法,指定该方法对应的Bean的生命域。
@Lazy : 用于修饰一个方法,指定该方法对应的Bean是否需要延迟初始化。
@DependsOn : 用于修饰一个方法,指定在初始化该方法对应的Bean之前初始化指定的Bean。
在实际项目中可能会混合使用XML配置和Java类配置混合使用:
⊙ 如果以XML配置为主,就需要让XMLpehiz能加载Java类配置。
<?xml version="1.0" encoding="UTF-8"?> <!-- Spring 配置文件的根元素,使用Spring-beans-4.0.xsd语义约束 --> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"><!-- 加载Java配置类 --><bean class="edu.pri.lime._7_6.bean.configuration.AppConfig" /> </beans>
由于以XML配置为主,因此应用创建Spring容器时,还是以XML配置文件为参数来创建ApplicationContext对象。那么Spring会先加载XML配置文件,在根据XML配置文件的指示去加载指定的Java配置类。
⊙ 如果以Java类配置为主,就需要让Java配置类能加载XML配置。在配置类上增加@ImportResource注解,修饰Java配置类,用于导入指定的XML配置文件。
package edu.pri.lime._7_6.bean.configuration;import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource;import edu.pri.lime._7_6.bean.Axe; import edu.pri.lime._7_6.bean.Person; import edu.pri.lime._7_6.bean.impl.Chinese; import edu.pri.lime._7_6.bean.impl.SteelAxe; import edu.pri.lime._7_6.bean.impl.StoneAxe;//指定类为配置类 @Configuration @ImportResource(value = { "classpath:app_7_6.xml" }) public class AppConfig {// 相当于定义一个名为personName的变量,其值为“lime”@Value("lime")String personName; // 配置Bean : stoneAxe@Bean(name="stoneAxe")public Axe stoneAxe(){return new StoneAxe();} // 配置Bean : steelAxe@Bean(name="steelAxe")public Axe steelAxe(){return new SteelAxe();} // 配置一个Bean:chinese@Bean(name="chinese")public Person chinese(){Chinese person = new Chinese();person.setName(personName);person.setAxe(steelAxe());return person;} }
由于以Java类配置为主,因此应用创建Spring容器时,应以Java配置类为参数,通过创建AnnotationConfigApplicationContext对象作为Spring容器。那么Spring会先加载Java配置类,在根据Java配置类的指示去加载指定的XML配置文件。
7 -- Spring的基本用法 -- 6... Spring 3.0 提供的Java配置管理相关推荐
- Spring 异步@Async注解用法 Spring @Async注解用法总结 Spring @Async基本用法示例
Spring 异步@Async注解用法 Spring @Async注解用法总结 Spring @Async基本用法示例 一.概述 在日常开发的工作中,经常会使用异步进行开发.Spring 提供一个简单 ...
- Spring基本用法1——Spring的核心机制:IOC、DI
前言:一直想写一个关于Spring的系列文章,但是构思许久却不知道以什么方式阐述,毕竟要把一个复杂框架说清楚并不是那么容易的,我也只能尽力而为了.Spring系列文章打算以这样的顺序展 ...
- 【Spring注解系列11】Spring后置处理器BeanPostProcessor用法与原理
1.BeanPostProcessor原理 先说,bean的后置处理器BeanPostProcessor接口中两个方法: postProcessBeforeInitialization:在初始化之前工 ...
- 【Spring学习】spring依赖注入用法总结
顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.Controller.Repository.Componen ...
- 补习系列(22)-全面解读 Spring Profile 的用法
目录 一.简介 二. 区分Bean对象 三. 设置Profile 3.1 WebApplicationInitializer接口 3.2 通过 web.xml定义 3.3 JVM启动参数 3.4 环境 ...
- Spring的基础用法
前言 上面的目录内容本文章不一定都会写到,本次的文章将非常简略,主写主要内容,次要内容需要读者有一定的学习基础才可以看懂以及掌握,本文章比较偏向于理论复习,注意是理论,本文章代码不多,代码比较多的是高 ...
- Spring Data JPA用法详解
Spring Data JPA: JPA(Java Persistence API)即java持久化API,它的出现主要是为了简化持久层开发以及整合ORM技术,结束Hibernate.TopLink. ...
- Spring核心技术(七)——Spring容器的扩展
本文将讨论如何关于在Spring生命周期中扩展Spring中的Bean功能. 容器的扩展 通常来说,开发者不需要通过继承ApplicationContext来实现自己的子类扩展功能.但是Spring ...
- java spring hiberate_Java程序员:Spring Boot和Hibernate一起使用的技巧
Hibernate不需要多介绍,它是Java中最受欢迎的ORM.同样,Spring Boot是功能最强大且易于使用的框架.本文并不是描述一些关于Hibernate或Spring Boot的用法,因为有 ...
最新文章
- 工作中涉及运维知识点的汇总
- STM32程序设计心得以及易错点
- 算法与数据结构(快速排序)
- 菜单之一:Menu基础内容
- linux网卡固件名,修改CentOS7网卡名称为传统名称eth0格式
- centos-7.2 node.js免编译安装
- mysql存储过程in_在MySQL存储过程中使用WHERE IN()
- 淘宝推荐系统简介分享总结
- 漫画:女生/男生告白攻略
- Python3学习笔记18-访问限制
- 火车进出栈【卡特兰数】【高精度】【压位】【压int位】
- Java的JVM,GC是什么?
- 便便教你玩转流程引擎Snaker
- 指数的增长和衰退问题
- 数据迁移工具之DataX
- redis资源未释放引发的问题
- r5 5600u和锐龙r5 4500u的区别
- 目标检测后处理:从nms到softer nms
- Xcode 官方下载地址 https://developer.apple.com/downloads/
- kafka的启动命令
热门文章
- mysql select 进阶_MySQL进阶_SELECT篇(一)
- centos 安装mysql5.6.12_CentOS6.4+MySQL-5.6.12 安装详解
- flask向html传函数,Flask----函数数据类型传参
- 执行环境及作用域分析
- 深入理解基本包装类型
- 阴阳师服务器维修拖延,阴阳师12月11日更新维护公告 阴阳师百闻牌联动开启
- 80c51汇编语言指令格式中的非必须,求单片机答案
- python中的super用法详解_Python中super的用法实例
- 硬币兑换python 每个面值有多个_【算法27】硬币面值组合问题
- docker实践第二版pdf 网盘_【漫画】什么是 docker?docker 应用场景解析