(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(一)的更多相关文章

  1. 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)

    组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...

  2. Spring使用ioc注解方式配置bean

    context层 : 上下文环境/容器环境 applicationContext.xml 具体示例: 现在ioc容器中添加context层支持: 包括添加xmlns:context.xsi:schem ...

  3. Spring初学之注解方式配置bean

    直接看代码: UserController.java package spring.beans.annotation.controller; import org.springframework.be ...

  4. 跟着刚哥学习Spring框架--通过XML方式配置Bean(三)

    Spring配置Bean有两种形式(XML和注解) 今天我们学习通过XML方式配置Bean 1. Bean的配置方式 通过全类名(反射)的方式   √ id:标识容器中的bean.id唯一. √ cl ...

  5. spring学习笔记 星球日two - 注解方式配置bean

    注解要放在要注解的对象的上方 @Autowired private Category category; <?xml version="1.0" encoding=" ...

  6. Spring框架学习(6)使用ioc注解方式配置bean

    内容源自:使用ioc注解方式配置bean context层 : 上下文环境/容器环境 applicationContext.xml 1 ioc注解功能 注解 简化xml文件配置 如 hibernate ...

  7. Spring boot 基于注解方式配置datasource

    Spring boot 基于注解方式配置datasource 编辑 ​ Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...

  8. Spring中基于注解方式管理bean

    操作步骤 第一步:导入相关jar包 spring IoC的基本包 Spring支持注解的Jar包 第二步:创建Spring配置文件,ApplicationContext.xml 引入约束和开启注解扫描 ...

  9. spring笔记--通过注解(annotation)配置Bean

    Spring能够在classpath下自动扫描,侦测和实例化具有特定注解的组件,这在Spring中成为组件扫描(Component scanning). 特定组件的注解包括: @Component:基 ...

随机推荐

  1. Libev源码分析03:Libev使用堆管理定时器

    Libev中在管理定时器时,使用了堆这种结构,而且除了常见的最小2叉堆之外,它还实现了更高效的4叉堆. 之所以要实现4叉堆,是因为普通2叉堆的缓存效率较低,所谓缓存效率低,也就是说对CPU缓存的利用率 ...

  2. laravel 验证码手机与提交手机的验证?

    假如我用自己的手机号码获得了验证码,然后在点击提交之前,更换了手机号一栏的input,用一个比如18888888888的手机号进行注册,用之前得到的验证码,是不是会出现注册成功的情况?是否应该考虑验证 ...

  3. List of open source software

    List of open source software https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/ ...

  4. 如何把thinkphp 的url改为.html

    ThinkPHP支持伪静态URL设置,可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行.例如,我们设置'URL_HTML_SUFFIX ...

  5. C++第5次作业

    运算符重载 定义 - 运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同行为. 运算符重载规则 - C++运算符除了少数几个,全都可以重载,且只能重载C++已有的运算 ...

  6. SuperSocket根据条件获取 Session

    如果你有一个自定义的属性 "CompanyId" 在你的 AppSession 类之中,如果你想要获取这个属性等于某值的 的所有 Session, 你可以使用 AppServer ...

  7. java super关键字和调用父类构造方法

    表示父类对象的默认引用 如果子类要调用父类被覆盖的实例方法,可用super作为调用者调用父类被覆盖的实例方法. 使用super调用父类方法 使用super调用父类的构造方法 调用构造方法 本类中调用另 ...

  8. UVA 11922 Permutation Transformer —— splay伸展树

    题意:根据m条指令改变排列1 2 3 4 … n ,每条指令(a, b)表示取出第a~b个元素,反转后添加到排列尾部 分析:用一个可分裂合并的序列来表示整个序列,截取一段可以用两次分裂一次合并实现,粘 ...

  9. H3C 基本的局域网间路由

  10. linux kdb 内核调试器

    许多读者可能奇怪为什么内核没有建立更多高级的调试特性在里面.答案, 非常简单, 是 Linus 不相信交互式的调试器. 他担心它们会导致不好的修改, 这些修改给问题打了补丁 而不是找到问题的真正原因. ...