创建可被发现的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;