spring装配bean的分为以下三种方式:
1.在XML中显示装配bean
工作中最常见的就是隐示配置,但是有些情况下只能使用显示配置,比如引用第三方库,要想让spring管理这个bean,不可能修改它的源码,只能通过显示配置。
话不多说,见例子
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:p="http://www.springframework.org/schema/p"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
6
7 <!--使用bean标签去申明bean-->
8 <bean id="waiter" class="xyz.mrwood.study.spring.example.Waiter" />
9 <!--可以保用p标签来注入依赖的bean-->
10 <bean id="store" class="xyz.mrwood.study.spring.example.Store" p:waiter-ref="waiter" />
11
12 </beans>
2.在JAVA中进行显示配置
通过 @Configuration 和 @Bean来搭配完成。
@Configuration
public class BeanConfig {
/**
* 申明bean
* @return
*/
@Bean
public Waiter waiter() {
return new Waiter();
}
@Bean
public Store store() {
Store store = new Store();
store.setWaiter(waiter()); //通过调用bean的方法来注入
return store;
}
}
3.隐示配置,分为两步:组件扫描、自动装配。
spring自动发现应用上下文创建的bean,分为两步:创建可被扫描的bean(@Component注解标记类),启动组件扫描(分为JAVA config配置、XML配置)
注解标记类
1 package xyz.mrwood.study.spring.example;
2
3 import org.springframework.stereotype.Component;
4
5 /**
6 * 项目:study-spring-example
7 * 包名:xyz.mrwood.study.spring.example
8 * 功能:
9 * 时间:2016-12-13 22:05
10 * 作者:Mr.Kiwi
11 */
12 @Component
13 public class Waiter {
14
15 public void service(String name){
16
17 System.out.println("service to " + name);
18 }
19
20 }
启动扫描的JAVA Config配置。
package xyz.mrwood.study.spring.example;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* 项目:study-spring-example
* 包名:xyz.mrwood.study.spring.example
* 功能:
* 时间:2016-12-13 22:13
* 作者:Mr.Kiwi
*/
@Configuration
@ComponentScan
public class ApplicationConfig {
}
@Configuration这个注解是指定此类是一个配置类,
@ComponentScan 可以指定扫描主键的范围,如果没有,那么默认当前类所在的包及其子包下所有的类。
XML配置
<?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 http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="xyz.mrwood.study.spring.example" />
</beans>
@ComponentScan 的XML表现形式。
自动装配
Spring自动满足bean之间的依赖,通过autowired进行自动装配
package xyz.mrwood.study.spring.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 项目:study-spring-example
* 包名:xyz.mrwood.study.spring.example
* 功能:
* 时间:2016-12-13 22:08
* 作者:Mr.Kiwi
*/
@Component
public class Store {
@Autowired
private Waiter waiter;
public void service(){
waiter.service("kiwi");
}
}
依赖注入的两种方式:属性注入和构造器注入。
属性注入
使用property标签为属性注入value。
<?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:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 配置一个 bean -->
<bean id="helloWorld" class="com.jackie.spring.helloworld.HelloWorld">
<!-- 为属性赋值 -->
<property name="name" value="Jackie"></property>
</bean>
</beans>
构造器注入
使用标签constructor-arg 通过构造器注入,前提是POJO中必须有此构造器
<bean id="car" class="com.jackie.spring.helloworld.Car">
<constructor-arg value="DaZhong" index="1"></constructor-arg>
<constructor-arg value="Shanghai" index="0"></constructor-arg>
<constructor-arg value="250000" type="float"></constructor-arg>
</bean>
Spring的配置文件及其简洁,我们甚至看不到声明bean,只有Context:component-scang该标签意为spring会扫描包下面的所有相关类,相关类是指具有以下字样的注解
@Component: 基本注解, 标识了一个受 Spring 管理的组件
@Respository: 标识持久层组件
@Service: 标识服务层(业务层)组件
@Controller: 标识表现层组件
标注了如上注解的类都是受Spring管辖的
Spring 还支持 @Resource 和 @Inject 注解,这两个注解和 @Autowired 注解的功用类似