Spring学习笔记 创建自动扫描并注入的bean

创建可被发现的bean

1.创建最基础的bean

使用@Component 将一个class标记为可被发现的类

@Component
public class BraveKnight {

此外,还可以在注解旁加上别名(默认名为类名的首字母小写)

@Component("knight")
public class BraveKnight {

配置Configuration

1.JavaConfig

使用java文件作为Configuration时,只需要最简单的配置如下

@Configuration
@ComponentScan
public class ConfigurationClass {
}

使用@Configuration标志着将这个Java文件作为Spring的配置类,而使用@ComponentScan则标志着将对指定的路径进行扫描,在未指定具体指的时候,默认扫描当前类所在包及子包。当然也可以使用多种方式配置多个包

// 可以指定单个
@Configuration
@ComponentScan(value="com.spring4.orign")//使用value属性指定根包名(数组)
public class ConfigurationClass {
}

// 也可以指定多个 使用value属性指定根包名(数组)
@Configuration
@ComponentScan(value={"com.spring4.orign","com.spring4.testConfig"})
public class ConfigurationClass {
}

//使用basePackage属性指定根包名(数组)
@Configuration
@ComponentScan(basePackages={"com.spring4.orign","com.spring4.testConfig"})
public class ConfigurationClass {
}
//使用basePackageClasses属性指定根包内包含的类(数组)
@Configuration
@ComponentScan(basePackageClasses={BraveKnight.class,CompactDisc.class})
public class ConfigurationClass {   
}
2.XMLConfig

使用XMLConfig进行配置时,添加一个标签即可

<context:component-scan base-package="com.spring4"/>

由于还未探索出在XML中如何指定多个base-package,此处暂不展开

配置自动注入依赖

1.基本使用

独木不成林,Spring的强大原因正源于其【依赖注入】即Dependency Injection 使用@autowired可以方便的注入依赖

@Component("knight")
public class BraveKnight {
    @Autowired
    private Quest quest;

使用@autowired注入依赖,使得BraveKnight类无需关注quest是如何被初始化的而只需要按照约定的方式调用即可,这使得代码间的耦合性大大的降低,避免了出现所谓的hardcod。

2.进阶使用
  • @autowired 可以使用在属性上,也可以使用在构造器上,甚至是任意方法上
@Component("knight")
public class BraveKnight {
    @Autowired
    private Tulinxiu tuxiuxiu;

    @Autowired
    public BraveKnight(Quest quest) {
        this.quest = quest;
    }

    @Autowired
    public void showSomeObject(CellPhone phone){
        phone.makeAPhoneCall();
    }
}

在注解为@Component的Java类被实例化之后,spring会找到该实体内的@Autowired注解的方法,尝试执行它并为这个方法注入依赖。与这个方法叫什么无关,而将@Autowired置于构造器上的方式称作构造器注入。两个实体的构造器相互调用对方作为依赖时会造成构造器注入锁死

@Component
public class Tututu {

    private BraveKnight knight;

    private String name;

    @Autowired
    public Tututu(BraveKnight knight) {
        this.knight = knight;
    }

@Component("knight")
public class BraveKnight {

    private Tututu tuxiuxiu;

    @Autowired
    private Quest quest;


    @Autowired
    public BraveKnight(Tututu tuxiuxiu) {
        this.tuxiuxiu = tuxiuxiu;
    }

在被注解为@autowired后,spring会努力的为其寻找匹配的依赖,如果没有找到则会报错,当然,如果这个这个实体并非必须的话,在@autowired后添加requried注解可以解决这一问题

@Component("knight")
public class BraveKnight {
    @Autowired(required=false)
    private Tututu tuxiuxiu;

此外,也可以使用@Resource来注入依赖

@Component("knight")
public class BraveKnight {
    @Resource
    private Tututu tuxiuxiu;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值