通过注解的方式配置

通过注解的方式配置

 

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();
	}

}

猜你喜欢

转载自shuizhongyue.iteye.com/blog/2292441
今日推荐