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>
网友评论