博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过注解(annotation)配置Bean
阅读量:6492 次
发布时间:2019-06-24

本文共 3303 字,大约阅读时间需要 11 分钟。

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

特定组件的注解包括:

    @Component:基本注解,标识了一个受spring管理的组件.

      @Repository:标识持久层组件

    @Service:标识服务层(业务层)组件

    @Controller:标识表现层组件

      对于扫描上的组件,Spring有默认的命名策略,使用非限定类名,第一个字母小写,也可以在注解中通过value属性值表示组件的名称.

  当在组件上使用了特定的注解之后,还需要在spring的配置文件中声明:

  其中bese-package是必须的属性,resource-pattern是可选的属性

    bese-package:制定一个需要扫描的基类包Spring容器将会扫描这个基类包及其子类包中的所有类.当需要扫描多个包时,可以使用逗号隔开.

    resource-pattern:如果仅希望扫描特定的类,而非基包下的所有类,可以使用这个属性过滤特定的类.如上即表示只扫描com.wang的子包dao中的所有类.

组件装配:

  <context:component-scan>元素还会自动注册AutowiredAnnotationBeanPostProcessor实例,该实例可以自动装配具有@autowired,@Resource,@Inject注解的属性.

使用@Autowired自动装配bean:

  @Autowired注解自动装配具有兼容类型的单个Bean属性:

    构造器,普通字段,一切具有参数的方法上都可以使用@autowired

    默认情况下,所有使用@Autowired注解的属性都需要被设置,当Spring找不到匹配的Bean装配属性时,会抛出异常,如果某一属性允许不被设置,可以设置@Autowired注解的required=false

    默认情况下,当IOC容器中存在多个类型兼容的bean时,通过类型的自动装配将无法工作,此时可以在@Qualifier注解里提供Bean的名称.

    @Autowired注解也可以应用在数组类型,集合属性,Map类型上.

 

下面通过一个例子,来应用一下上面的知识点,包结构和类如下,是一个简单的mvc结构对User实现增删改查的例子:

User类:

//主要演示注解,这里不再定义属性public class User {}

UserDao接口:

public interface UserDao {    public void add();    public void delete();    public void update();    public void search();}

UserDaoImpl类:

@Repositorypublic class UserDaoImpl implements UserDao {    @Override    public void add() {        System.out.println("添加用户");    }    @Override    public void delete() {        System.out.println("删除用户");    }    @Override    public void update() {        System.out.println("更新用户");    }    @Override    public void search() {        System.out.println("查询用户");    }}

UserService类:

@Servicepublic class UserService {    @Autowired    private UserDao userDao;            public void add() {        userDao.add();        System.out.println("service add..");            }    public void delete() {        userDao.delete();        System.out.println("service delete..");            }    public void update() {        userDao.update();        System.out.println("service update..");            }    public void search() {        userDao.search();        System.out.println("service search..");            }}

UserAction类:

@Controllerpublic class UserAction {    @Autowired    private UserService userService;        @Autowired(required=false)    private User user;    public String add(){            userService.add();        System.out.println("UserAction add..");        System.out.println(user);        return null;    }    public String delete(){                userService.delete();        System.out.println("UserAction delete..");        return null;    }    public String update(){                userService.update();        System.out.println("UserAction update..");        return null;    }    public String search(){                userService.search();        System.out.println("UserAction search..");        return null;    }    }

配置文件beans.xml:

测试代码:

public class Test1 {    public static void main(String[] args) {        ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");            UserAction userAction=(UserAction) ctx.getBean("userAction");    userAction.add();        }}

打印结果:

添加用户

service add..
UserAction add..
null

因为在User类中,我们没有添加任何注解信息,而在UserAction类中定义属性user时,又在@Autowired中添加了required="false",所有打印出来的user为null.

转载地址:http://bghuo.baihongyu.com/

你可能感兴趣的文章
【云栖精选】《云栖精选阿里巴巴技术实战2016年刊》重磅发布
查看>>
Javascript:谈谈JS的全局变量跟局部变量
查看>>
MonoDevelop的app.config问题
查看>>
if continue 语句
查看>>
When you are old (当你老了)
查看>>
SAE+Servlet+JSP实现微信公众平台OAuth2.0网页授权的使用
查看>>
Fast TileMap
查看>>
Problem25
查看>>
软件项目进度控制要处理好的四个基本问题(转)
查看>>
iOS沙盒目录结构
查看>>
通过IMAP定向收取网易邮箱邮件(疑难)
查看>>
ARTS 第一周
查看>>
【PPT已更新】给开发者的区块链技术指南 | JTalk 掘金线下活动第五期
查看>>
HTML标签 转 NSAttributedString
查看>>
vue实现根据多选框按钮,动态给百度地图添加和删除相应的覆盖物
查看>>
前奏交响曲
查看>>
深入理解Spring系列之七:web应用自动装配Spring配置
查看>>
axios插件学习
查看>>
用python手刃Leetcode(9):回文数【简单题】
查看>>
SpringFlux入门(上篇)
查看>>