一、最小化xml配置
我们使用<bean>
标签定义bean以及使用<constructor-arg>
或者<property>
装配bean。对于少量的bean的应用来说很好,但是随着应用的发展,我们不得不编写越来越复杂的xml。
然而,spring提供了减少xml的配置的方法。
自动检测(autodiscovery),自动识别哪些类要装配成bean,减少<bean>
标签的使用。
自动装配(autowiring),自动装配bean的属性。减少<property>
和<constructor-arg>
标签的使用
二、自动装配bean
自动装配的作用:不用为所有属性赋值。
只能为bean的引用类型成员变量自动装配,不能为bean的基本类型成员变量自动装配。
1. 实现自动装配的方式
- 通过配置xml
- 通过注解。
2. 自动装配引用类型成员变量的实现策略
- xml文件方式,是在xml文件中找相同类的不同id的bean的属性装配到该bean的属性中。
- 注解方式,则在xml文件找到一个引用对象的bean装配到该引用变量属性中。注解方式的方式,在类中不需要为该引用变量提供set方法。
3. 具体实现
- 通过配置xml自动装配bean
通过设置autowire属性,其中有4种类型的自动装配策略,byName、byType、constructor、autodetect。
byName:把与bean的属性具有相同名字的其他bean自动装配到bean的对应属性中。
例如,
<bean id="car" class="beans.Car"
p:brand" value="baoma" p:price" value="12000"/>
<bean id="person" class="beans.Person"
p:name="zhangsan" p:car-ref="car"/>
//自动装配,不需要为car属性赋值
<bean id="car2" class="beans.Car"
p:name="lisi" autowire="byName"/>
- 通过注解自动装配bean
在xml文件中声明启用注解装配<context:annotation-config />
在javabean类中相应属性上添加注解,spring支持的自动装配注解@Autowired、@Inject、@Resource。
例如,
1).javabean类添加注解
public class User {
private String name;
@Autowired(required=false)
private Car car;
...相应的set、get方法...
}
2).配置xml文件
//启用注解装配
<context:annotation-config />
//注解自动装配bean的Car属性,在声明bean的时候不需要为Car属性赋值
<bean id="car2" class="beans.Car"
p:name="zhangsan" />
4. 可选的自动装配
如果没有匹配的bean,或者存在多个匹配的bean,@Autowired注解会出NoSuchBeanDefinitionException异常
可以通过设置注解的required属性为false配置自动装配是可选的,如果没有匹配的bean会自动为属性设置为null。
三、自动检测Bean
1.基本知识
通过xml配置<context:component-scan>
,spring会自动检测添加了自动检测注解的类。还会启动自动装配的。不需要<context:annotation-config>
。自动的为该类创建bean。常用的注解:@Component、@Controller、@Repository、@Service
2. 使用场景
自动检测即可以为你自动生成bean,也可以自动装配。适用于service层调用dao层,如:
UserService调用UserDao层的方法时,UserService类有的成员变量UserDao对象。就可以自动检测Userservice类,自动装配userDao对象。不需要在UserService类中new UserDao,只需声明就行。
3. 具体实现
例如,
1).配置xml文件
<context:componet-scan base-package="" />
2).标注要自动检测的类
@Component
public class UserService{
@Autowired
UserDao userDao ;
public void add(){
userDao.add();
}
}
自动将UserService类注册为Spring Bean ,Bean的id默认为第一个字母小写的类名即为userService。
也可以显示的自定义bean的id,即@Component("myService")。
自动装配了userDao。
四、使用Spring基于java的配置
通过定义一个配置类来代替xml文件,在java类中配置bean代替在xml中配置bean
1).xml的配置
<context:componet-scan base-package="" />
2).定义一个配置类
@configuration
public class SpringConfig{
@Bean
public Car duke(){
Car car = new Car();
car.setBrand("baoma");
car.setPrice(12000);
return car;
}
}