Spring装配Bean
spring三种方式装配bean:
- 自动化装配bean
- 借助java来进行bean装配
- 使用xml进行bean装配
自动化装配Bean
Spring 从两个角度实现自动化装配
- 组件扫描,spring自动发现上下文中的Bean
- 自动装配,spring自动满足bean之间的依赖
比如我在在类上添加注解@Component,这表明该类会作为组件类,并告知spring会为这个类创建Bean,但是组件扫描默认是不启动的,我们任然需要配值Spring,命令其去寻找带有注解的@Component注解的类,并为其创建Bean.
这时可以使用@CompoentScan,默认会扫描与配值类相同的包,同时会扫描这个包下的子包.
当然也可以使用XML来启用组件扫描
<context:component-scan base-package="cn.itcast" />
测试时使用spring的springJunit4ClassRunner,以便在测试的时候自动创建spring上下文。而注解@ContextConfiguration会告诉它需要在哪一个类中加载配值
每创建一个Bean,就会为其创建一个ID,一般是以这个类名的首字母小写命名的,同时你也可以为其起一个特别的名字。 @Component("nameclass")
在注入的时候我们可以用@Autowired来标注,进行注入。
例子:
@Service
public class FunctionService {
public String sayHallo(String word){
return "hello "+word+" !";
}
}
选择使用@Component @Servie @Repository @Controller,把Bean交给Spring管理。
//@Autowired是自动注入的注解,
@Autowired
FunctionService functionService;
将实例化好的FunctionService类注入到本类中的属性。
@Configuration//声明当前类是一个配置类
@ComponentScan("site.wangxin520.springstudy")//相当于xml中配置到 扫描包
public class DiConfig {
}
但是任然需要创建配值类,设置扫描包
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DiConfig.class);
UserFuctionService userFuctionService = context.getBean(UserFuctionService.class);
加载配值类。
通过Java代码装配Bean
使用第三方的库装配到你的应用上,就不能采用自动化的注解,这时就需要使用XML和JAVA来进行配值。 Java注解是Spring4.0推荐的方法,属于显式配值。 java注解中只不过去掉了@Service和@Autowrid
public class FunctionService {
public String sayHallo(String word){
return "hello "+word+" !";
}
}
//需要包含set方法
public class UserFuctionService {
FunctionService functionService;
public void setFunctionService(FunctionService functionService) {
this.functionService = functionService;
}
public String sayHello(String word) {
return functionService.sayHallo(word);
}
}
- 创建配值类
- 声明Bean,它会告诉Spring当前对象返回的是一个对象Bean,Spring会将其加载到其的上下文中。
- 注入
@Configuration
//这里注意的是,没有使用包扫描的注解
public class JavaConfig {
@Bean//使用Bean注解声明当前方法的返回值是一个Bean,名称就是方法名
public FunctionService functionService(){
return new FunctionService();
}
//使用构造器注入
@Bean
public userFunctionService functionService(){
return new userFunctionService(functionService());
}
//使用set注入
@Bean
public UserFuctionService userFuctionService(){
//当使用userFunctionService时候,就会调用这个里面的方法去获取bean
UserFuctionService userFuctionService=new UserFuctionService();
userFuctionService.setFunctionService(functionService());
return userFuctionService;
}
@Bean//这是另外一种注入的方式,直接使用参数注入的方式
public UserFuctionService userFuctionService(FunctionService functionService){
UserFuctionService userFuctionService=new UserFuctionService();
userFuctionService.setFunctionService(functionService());
return userFuctionService;
}
}
使用XML装配Bean
使用XML配置文件的方式装配bean,首要的就是要创建一个基于Spring配置规范的XML文件,该配置文件以<beans>为根元素(相当于Java配置的@Configuration注解),包含一个或多个<bean>元素(相当于配置类中@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">
<!--通过类的全限定名来声明要创建的bean-->
<bean class="spring.impl.BenzCar"></bean>
</beans>
加载配值文件
ApplicationContext context = new ClassPathXmlApplicationContext("resource/applicationContext.xml");
//XML的方式如果没有明确给定ID,默认bean的ID会根据类的全限定名来命名,以#加计数序号的方式命名。
Car car = (Car)context.getBean("spring.impl.BenzCar#0");
- 构造器注入
bean id="car" class="spring.impl.BenzCar"></bean>
<bean id="man" class="spring.impl.Man">
<!--通过Man的构造器注入Car的实例对象-->
<constructor-arg ref="car"></constructor-arg>
</bean>
如果构造器有很多属性也可以注入值
<bean id="car" class="spring.impl.BenzCar"></bean>
<bean id="man" class="spring.impl.Man">
<!--分别注入字面值和对象的应用-->
<constructor-arg value="12"></constructor-arg>
<constructor-arg ref="car"></constructor-arg>
</bean>
或者是一个集合
<constructor-arg>
<list>
<ref bean="benzCar"/>
<ref bean="qqCar"/>
</list>
</constructor-arg>
- setter注入
<bean id="man" class="spring.impl.Man">
<!--通过属性注入的方式注入Car的实例-->
<property name="car" ref="benzCar"></property>
</bean>
XML配置文件中属性注入的属性名必须要和Java类中Setter方法对应的属性名一致
配值的混合
在Java配值Spring时,如果配值类太大一般会将其拆分为两个或多个配值来,然后使用@Import(name.class)进行导入组合。
但是一个配值文件是JavaConfig,一个是Xml配值的,这是要用@ImportResource(xxxxx.xml)
那么如果想反过来在xml中引入java配值文件呢? 在xml中我们可以使用
<import resource="classpath:xxx.xml" />
来引入xml配值文件 而如果要在XML中引入Java配置,只需将Java配置类当成普通的bean在XML中进行声明即可,但是在测试的时候要注意开启组件扫描,因为加载XML配置的上下文对象只会加载XML配置文件中的bean定义,无法让基于Java配置类产生bean的装配机制自动生效
<!--开启组件扫描,在测试的时候配置类才能向容器中注册类中声明的bean-->
<context:component-scan base-package="spring"/>
<!--XML中引入Java配置类:将配置类声明为bean-->
<bean class="spring.config.CarConfig"></bean>
<bean id="man" class="spring.impl.Man">
<constructor-arg ref="laoSiJi"></constructor-arg>
</bean>
- 浏览器缓存问题的解决
- nginx下目录浏览及其验证功能、版本隐藏等配置记录
- Sqlite的多表连接更新
- Enterprise Library 4.1学习笔记6----加密应用程序块
- 浅谈数据库主键策略
- nginx应用总结(1)--基础认识和应用配置
- nginx反向代理tomcat访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题
- Enterprise Library 4.1学习笔记5----实体验证程序块
- Python防止sql注入
- 电工学PLC编程的入门建议
- 人工智能、区块链、图灵测试……这30个大数据热词你真的都懂吗?
- Enterprise Library 4.1学习笔记4----缓存应用程序块
- 设置py文件的路径
- jenkins中通过git发版操作记录
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- meterpreter shell | 加固shell
- R语言绘图:复杂散点图绘制
- windows下部署sentinel模式的Redis主从集群
- tmux | 加固shell
- Windows下离线部署Redis主从集群
- SSH 后门 | Nmap 脚本
- 【Tomcat源码解析】第二章:不用死记硬背记住Tomcat整体架构
- 计划任务后门 | Linux 后门系列
- alias后门 | Linux 后门系列
- vim 后门 | Linux 后门系列
- 个站建设基础教程
- 【Tomcat源码解析】第一章:如何搭建源码阅读环境
- LD_PRELOAD 后门 | Linux 后门系列
- 如何利用k8s拉取私有仓库镜像
- rsyslog queue队列权威指南