基于注解的方式配置Bean

一:在classpath中扫描组件

1.组件扫描(component scanning):spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件。

2.特定的组件包括:

  • @Component:基本注解,标识了一个受spring管理的组件。
  • @Repository:标识持久层组件
  • @Service:标识服务层(业务层)组件
  • @Controller:标识表现层组件

3.对于扫描到的组件,spring有默认的命名策略,使用非限定类名,第一个字母小写,也可以在注解中通过value属性值标识组件的名称。(例子 UserController的bean名称就是userController,可以通过形式赋值@Repository("userRepository"))

二:注解属性配置

1.当在组件类中使用了特定的注解之后,还需要在spring中配置文件中声明context:component-scan(注意要先导入命名空间context)

  • base-package:指定一个需要扫描的基类包,spring容器将会扫描这个基类包里以及子包中的所有类,当需要扫描多个包时,可以使用逗号分隔。
  • 如果仅希望扫描特定的类而非基包下的所有类,可以使用resource-pattern属性过滤特定的类
    <?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-4.0.xsd">
    	<!--导入context命名空间  -->
    	<!-- 指定spring IOC容器扫描的包 -->
    	<!-- 可以通过resource-pattern指定扫描的资源 -->
    	<context:component-scan base-package="com.dhx.annotation"
    		resource-pattern="repository/*.class">
    	</context:component-scan> 
    
    </beans>
    
  • context:include-filter:子节点表示要包含的目标类,通过要配合 use-default-filters配合使用
  • context:exclude-filter 子节点表示要排除在外的目标类
  • context:component-scan下可以拥有若干个context:include-filter和context:exclude-filter子节点

 三:代码实现

1.创建一个TestObject类并加上@Component注解

package com.dhx.annotation;

import org.springframework.stereotype.Component;

@Component
public class TestObject {

}

2.创建一个UserController类并加上@Controller注解

package com.dhx.annotation.controller;

import org.springframework.stereotype.Controller;

@Controller
public class UserController {
	
	public void execute() {
		System.out.println("UserController Execute ...");
	}

}

3. 创建一个UserRepository接口,实现这个类并加上@Repository注解

package com.dhx.annotation.repository;

public interface UserRepository {
		
		void save();
}
package com.dhx.annotation.repository;

import org.springframework.stereotype.Repository;

@Repository("userRepository")//spring bean的名称
public class UserRepositoryimpl implements UserRepository {

	@Override
	public void save() {
		System.out.println("UserRepository Save ...");
	}

}

4.  创建一个UserService类,并加上注解@Service

package com.dhx.annotation.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {
	
	public void add() {
		System.out.println("UserService add ...");
	}

}

 5.配置XML文件,要导入context命名空间

<?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-4.0.xsd">
	<!--导入context命名空间  -->
	<!-- 指定spring IOC容器扫描的包 -->
	<!-- 可以通过resource-pattern指定扫描的资源 -->
	<!-- 
	<context:component-scan base-package="com.dhx.annotation"
		resource-pattern="repository/*.class">
	</context:component-scan> 
	-->
	
	
	
	<!--context:exclude-filter 子节点指定排除那些指定表达式的组件
		annotation:注解类型
	  -->
	<!--  
	<context:component-scan base-package="com.dhx.annotation">
		<context:exclude-filter type="annotation" 
		expression="org.springframework.stereotype.Repository"/>
	</context:component-scan>
	--> 
	
	<!--context:include-filter 子节点指定包含那些指定表达式的组件,该子节点需要 use-default-filters配合使用-->
	<!--  
	<context:component-scan base-package="com.dhx.annotation"
		use-default-filters="false">
		<context:include-filter type="annotation" 
		expression="org.springframework.stereotype.Repository"/>
	</context:component-scan>
	-->
	<!-- 	assignable:指定的类型 -->
	<!--  
	<context:component-scan base-package="com.dhx.annotation">
		<context:exclude-filter type="assignable" 
		expression="com.dhx.annotation.service.UserService"/>
	</context:component-scan>
	-->
	<!-- 	assignable:指定的类型 -->
	<context:component-scan base-package="com.dhx.annotation"
		use-default-filters="false">
		<context:include-filter type="assignable" 
		expression="com.dhx.annotation.service.UserService"/>
	</context:component-scan>
	
	
	
</beans>

6.测试

package com.dhx.annotation;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.dhx.annotation.controller.UserController;
import com.dhx.annotation.repository.UserRepository;
import com.dhx.annotation.repository.UserRepositoryimpl;
import com.dhx.annotation.service.UserService;

public class Main {
	
	public static void main(String[] args) {
		
		ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-annotation.xml");
		
		
		TestObject to=(TestObject) ctx.getBean("testObject");
		System.out.println(to);
		
		UserController userController=(UserController) ctx.getBean("userController");
		System.out.println(userController);
		
		
		UserService userService=(UserService) ctx.getBean("userService");
		System.out.println(userService);
		
		UserRepository userRepository=(UserRepository) ctx.getBean("userRepository");
		System.out.println(userRepository);
		
		
	}

}

猜你喜欢

转载自blog.csdn.net/qq_39093474/article/details/85761568