spring之通过注解方式配置Bean(一)
(1)组件扫描:spring能够从classpath下自动扫描、侦测和实例化具有特定注解的组件。
(2)特定组件包括:
- @Component:基本注解,标识一个受spring管理的组件;
- @Respority:标识持久层组件;
- @Service:标识服务层(业务层)组件;
- @Controller:标识表现层组件;
(3)对于扫描到的组件,spring有默认的命名规则:使用非限定类名。第一个字母小写,也可以在注解中通过value属性值标识组件的名称。
(4)当在组件类上使用了特定的注解之后,还需要在spring的配置文件中声明<context:component-scan>:
- base-package属性指定一个需要扫描的基类包,spring容器将会扫描这个基类包里及其子包的所有类;
- 当需要扫描多个包时,可以使用逗号分隔;
- 如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类,示例:
<contest:component-scan base-package=":com.gong.spring.beans" resource-pattern="autowire/*.class"> - <context:include-filter>子节点表示要包含的目标类
- <context:exclude-filter>子节点表示要排除在外的目标类
- <context:component-scan>下可以拥有若干个<context:include-filter>和<context:exclude-filter>子节点;
一、所需环境
引入以下jar包,加入到build path中:

两个连接数据库的,五个spring核心包,aop是额外的使用注解方式需要引入的包,一定要记得引入这个包。
基本目录如下:

二、基本配置
TestObjec.java
package com.gong.spring.beans.annotation; import org.springframework.stereotype.Component; @Component
public class TestObject { }
UserController.java
package com.gong.spring.beans.annotation.controller; import org.springframework.stereotype.Controller; @Controller
public class UserController {
public void execute() {
System.out.println("UserController的execute方法");
}
}
UserRepository.java
package com.gong.spring.beans.annotation.repository;
public interface UserRepository {
public void save();
}
UserRepositoryImpl.java
package com.gong.spring.beans.annotation.repository; import org.springframework.stereotype.Repository; //可以指定使用时的名字
@Repository(value="userRepository")
public class UserRepositoryImpl implements UserRepository{ @Override
public void save() {
// TODO Auto-generated method stub
System.out.println("UserReposityImpl的save方法");
} }
UserService.java
package com.gong.spring.beans.annotation.service; import org.springframework.stereotype.Service; @Service
public class UserService {
public void add() {
System.out.println("UserService中的add方法");
}
}
Main.java
package com.gong.spring.beans.annotation; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.gong.spring.beans.annotation.controller.UserController;
import com.gong.spring.beans.annotation.repository.UserRepository;
import com.gong.spring.beans.annotation.service.UserService; public class Main {
public static void main(String[] args) {
//1.创建spring的IOC容器对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-annotation.xml");
//2.从容器中获取Bean实例
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);
} }
beans-annotation.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.3.xsd"> <!-- 配置springIOC容器扫描的包 -->
<context:component-scan base-package="com.gong.spring.beans.annotation"></context:component-scan> </beans>
输出:

说明这些带有注解的类已经被spring所识别并被IOC容器所管理。需要注意的是,默认情况下获取bean的实例时,名字是类名,但首字母是小写。例如TestObject通过getBean("testObject")来获取,当然,也可以在注解时使用value属性来声明bean的名字。
三、子节点配置
再来看:
<!-- 配置springIOC容器扫描的包 -->
<context:component-scan base-package="com.gong.spring.beans.annotation"
resource-pattern="repository/*.class"></context:component-scan>
指定扫描的模式之后,我们就只能访问到repository下面的组件了,即输出:
=
在<context:include-filter>和<context:exclude-filter>子节点支持多种类型的表达式:
- annotation:所有标注了XxxAnnotation的类;
- assignable:所有继承或扩展XxxService的类;
- aspectj
- regex
- custom
(1)使用annotation的方式
<!-- 配置springIOC容器扫描的包 -->
<context:component-scan base-package="com.gong.spring.beans.annotation">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
不包含org.springframework.stereotype.Repository,即输出:

<!-- 配置springIOC容器扫描的包 -->
<context:component-scan base-package="com.gong.spring.beans.annotation"
use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
只包含org.springframework.stereotype.Repository,注意需要配置use-default-filters为false,即输出:

(2)使用assignable方式
<!-- 配置springIOC容器扫描的包 -->
<context:component-scan base-package="com.gong.spring.beans.annotation">
<context:exclude-filter type="assignable" expression="com.gong.spring.beans.annotation.repository.UserRepository"/>
</context:component-scan>
不包含UserRepository接口及其实现类的。
<!-- 配置springIOC容器扫描的包 -->
<context:component-scan base-package="com.gong.spring.beans.annotation"
use-default-filters="false">
<context:include-filter type="assignable" expression="com.gong.spring.beans.annotation.repository.UserRepository"/>
</context:component-scan>
设置use-default-filters="false"。只包含UserRepository接口及其实现类的。
spring之通过注解方式配置Bean(一)的更多相关文章
- 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)
组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...
- Spring使用ioc注解方式配置bean
context层 : 上下文环境/容器环境 applicationContext.xml 具体示例: 现在ioc容器中添加context层支持: 包括添加xmlns:context.xsi:schem ...
- Spring初学之注解方式配置bean
直接看代码: UserController.java package spring.beans.annotation.controller; import org.springframework.be ...
- 跟着刚哥学习Spring框架--通过XML方式配置Bean(三)
Spring配置Bean有两种形式(XML和注解) 今天我们学习通过XML方式配置Bean 1. Bean的配置方式 通过全类名(反射)的方式 √ id:标识容器中的bean.id唯一. √ cl ...
- spring学习笔记 星球日two - 注解方式配置bean
注解要放在要注解的对象的上方 @Autowired private Category category; <?xml version="1.0" encoding=" ...
- Spring框架学习(6)使用ioc注解方式配置bean
内容源自:使用ioc注解方式配置bean context层 : 上下文环境/容器环境 applicationContext.xml 1 ioc注解功能 注解 简化xml文件配置 如 hibernate ...
- Spring boot 基于注解方式配置datasource
Spring boot 基于注解方式配置datasource 编辑 Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...
- Spring中基于注解方式管理bean
操作步骤 第一步:导入相关jar包 spring IoC的基本包 Spring支持注解的Jar包 第二步:创建Spring配置文件,ApplicationContext.xml 引入约束和开启注解扫描 ...
- spring笔记--通过注解(annotation)配置Bean
Spring能够在classpath下自动扫描,侦测和实例化具有特定注解的组件,这在Spring中成为组件扫描(Component scanning). 特定组件的注解包括: @Component:基 ...
随机推荐
- Libev源码分析03:Libev使用堆管理定时器
Libev中在管理定时器时,使用了堆这种结构,而且除了常见的最小2叉堆之外,它还实现了更高效的4叉堆. 之所以要实现4叉堆,是因为普通2叉堆的缓存效率较低,所谓缓存效率低,也就是说对CPU缓存的利用率 ...
- laravel 验证码手机与提交手机的验证?
假如我用自己的手机号码获得了验证码,然后在点击提交之前,更换了手机号一栏的input,用一个比如18888888888的手机号进行注册,用之前得到的验证码,是不是会出现注册成功的情况?是否应该考虑验证 ...
- List of open source software
List of open source software https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/ ...
- 如何把thinkphp 的url改为.html
ThinkPHP支持伪静态URL设置,可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行.例如,我们设置'URL_HTML_SUFFIX ...
- C++第5次作业
运算符重载 定义 - 运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同行为. 运算符重载规则 - C++运算符除了少数几个,全都可以重载,且只能重载C++已有的运算 ...
- SuperSocket根据条件获取 Session
如果你有一个自定义的属性 "CompanyId" 在你的 AppSession 类之中,如果你想要获取这个属性等于某值的 的所有 Session, 你可以使用 AppServer ...
- java super关键字和调用父类构造方法
表示父类对象的默认引用 如果子类要调用父类被覆盖的实例方法,可用super作为调用者调用父类被覆盖的实例方法. 使用super调用父类方法 使用super调用父类的构造方法 调用构造方法 本类中调用另 ...
- UVA 11922 Permutation Transformer —— splay伸展树
题意:根据m条指令改变排列1 2 3 4 … n ,每条指令(a, b)表示取出第a~b个元素,反转后添加到排列尾部 分析:用一个可分裂合并的序列来表示整个序列,截取一段可以用两次分裂一次合并实现,粘 ...
- H3C 基本的局域网间路由
- linux kdb 内核调试器
许多读者可能奇怪为什么内核没有建立更多高级的调试特性在里面.答案, 非常简单, 是 Linus 不相信交互式的调试器. 他担心它们会导致不好的修改, 这些修改给问题打了补丁 而不是找到问题的真正原因. ...