通过注解的方式配置
spring能够从classpath下自动扫描具有特定注解的组件
特定注解的组件包括
@Component基本注解,标识一个受Spring管理的组件
@Respository标识持久层组件
@Service标识服务层组件
@Controller标识表现层组件
对于扫描的组件,spring默认命名策略非限定类名第一个字母小写
也可以通过注解的value属性标识组件的名称
在组件类上使用特定注解后,还需要在spring配置文件中声明<context:component-scan>
-base-package属性指定需要扫描的基类包,spring容器会扫描这个基类包及其子包所有类
-扫描多个包时可以使用逗号隔开
-如果扫描特定类,非基类包,可使用resource-pattern属性过滤特定类
-<context:include-filter>子节点要包含的目标类
-<context:exclude-filter>子节点表示要排除在外的目标类
-<context:component-scan>下可以拥有若干个<context:include-filter>和<context:exclude-filter>
<?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:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" 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/util http://www.springframework.org/schema/util/spring-util-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <!-- 扫描子包的类 --> <!-- <context:component-scan base-package="com.hous" resource-pattern="controller/*.class"> </context:component-scan> --> <!-- exclude-filter:排除指定表达式的组件(@Service等) --> <context:component-scan base-package="com.hous" use-default-filters="false"> <!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/> --> <!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"></context:include-filter> --> <!-- <context:exclude-filter type="assignable" expression="com.hous.service.UserService"/> --> <context:include-filter type="assignable" expression="com.hous.service.UserService"/> </context:component-scan> </beans>
package com.hous.test; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.hous.controller.UserController; import com.hous.respository.UserRespository; import com.hous.service.UserService; public class Test { public static void main(String[] args) { //1.创建spring的IoC容器 ClassPathXmlApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService) cxt.getBean("userService"); userService.save(); UserRespository userRespository = (UserRespository) cxt.getBean("userRespositoryImpl"); userRespository.save(); UserController userController = (UserController) cxt.getBean("userControllerImpl"); userController.save(); //关闭容器 cxt.close(); } }
bean之间的关系
使用@Autowired自动装配Bean
1)@Autowired注解自动装配具有兼容类型的单个Bean属性
构造器,普通字段(非public)和一切具有参数方法的都可以应用@Autowired注解
2)使用@Autowired注解属性时,当spring找不到匹配的Bean属性会抛出异常,
若某一属性不允许被设置,可以设置@Autowired注解的required属性为false
3)当IoC容器中存在多个类型兼容的Bean时,自动装配无法工作,可以使用
@Qualifier注解提供Bean的名称
4)@Autowired注解应用在数组类型属性上,会把所有匹配的Bean自动装配
5)@Autowired注解应用在集合属性上,会读取集合类型信息然后自动装配与之兼容的Bean
6)@Autowired注解应用在java.util.Map上时,若Map的键值为String,则Spring将
自动装配与之Map值类型兼容的Bean,此时Bean的名称做为键值
使用@Resource或@Inject自动装配Bean
@Resource提供Bean名称属性,该属性为空则自动采用标注处变量或方法名
做为Bean的名称
@Inject和@Autowired注解一样,按照类型匹配注入Bean,但没有required属性
package com.hous.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.hous.respository.UserRespository; @Service(value="userService") public class UserServiceImpl implements UserService { @Autowired private UserRespository UserRespository; @Override public void save() { System.out.println("UserServiceImpl save()方法"); UserRespository.save(); } }
package com.hous.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.TestBean; import com.hous.respository.UserRespository; @Service(value="userService") public class UserServiceImpl implements UserService { @Autowired(required=false) private TestBean testBean; @Override public void save() { System.out.println("UserServiceImpl save()方法"); System.out.println(testBean); } }
package com.hous.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import com.hous.respository.UserRespository; @Service(value="userService") public class UserServiceImpl implements UserService { // @Autowired // @Qualifier("userRespositoryImpl") private UserRespository UserRespository; @Autowired public void setUserRespository(@Qualifier("userRespositoryImpl") UserRespository userRespository) { UserRespository = userRespository; } @Override public void save() { System.out.println("UserServiceImpl save()方法"); UserRespository.save(); } }