@Component
@Component //默认bean ID是将类名的第一个字母变为小写
@Component("test") //指定bean ID
表明该类会作为组件类,并告知Spring要为这个类创建bean。
@Named
@Named
@Named("test")
@Named是Java依赖注入规范中提供的。Spring支持将@Named作为@Component注解的替代方案。两者之间有一些细微的差异,但是在大多数场景中,它们是可以相互替换的。
@Controller
@Controller
@Controller("testController")
@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法。
@Service
@Service
@Service("testService")
@Service注解:用于标注业务层组件
@Repository
@Repository
@Repository("testRepository")
@Repository注解:用于标注数据访问组件,即DAO组件
@ComponentScan
@ComponentScan //如果没有其它配置的话,@ComponentScan默认会扫描与配置类相同的包。
@ComponentScan("包名")
@ComponentScan(basePackages="包名")//更加清晰的表明设置的是基础包
@ComponentScan(basePackages={"包名","包名"})//设置多个基础包,basePackages属性设置为要扫描包的一个数组
@ComponentScan(basePackageClasses={class,class})//basePackageClasses属性所设置的数组中包含了类。这些类所在的包将会作为组件扫描的基础包。
组件扫描,如果没有其它配置的话,@ComponentScan默认会扫描与配置类相同的包。
@AutoWired
@AutoWired //自动装配
@AutoWired(required=false)//设置为false时,Spring会尝试执行自动装配,但是如果没有匹配的bean的话,Spring将会让这个bean处于未装配的状态。
@AutoWired注解可以用在类的任何方法上。是Spring特有的注解。
@Inject
@Inject
@Inject是Java依赖注入规范中提供的。Spring同时支持@Inject与@AutoWired。两者之间有一些细微的差异,但是在大多数场景中,它们是可以相互替换的。
@Configuration
@Configuration
表明这是一个配置类。
@ContextConfiguration
@ContextConfiguration(classes=config.class)
加载配置文件。
@Import
@Import(config.class)
导入配置类。
@ImportResource
@ImportResource("classpath:config.xml")
加载XML配置文件。
@Primary与@Qualifier
@Autowired
public void setDessert(Dessert dessert)
{
this.dessert = dessert;
}
@Component
public class Cake implements Dessert {...}
@Component
public class Cookies implements Dessert {...}
@Component
public class IceCream implements Dessert {...}
Spring自动装配时,不知道选哪一个,只好宣告失败并抛出异常。因为它们都实现了Dessert接口。
这时我们可以将其中的 一个bean设置为首选的bean。
@Primary
@Component
public class Cake implements Dessert {...}
但是,如果你标示了两个或更多的首选bean,那么它就无法正常工作了。
这时,我们可以通过Spring的限定符在所有可选的bean上进行缩小范围的操作,最终能够达到只有一个bean满足所规定的条件。
@Qualifier注解是使用限定符的主要方式。它可以与@Autowired和@Inject一起使用。
@Autowired
@Qualifier("iceCream ") //参数就是想要注入的bean的ID。
public void setDessert(Dessert dessert)
{
this.dessert = dessert;
}
同时我们可以为bean设置自己的限定符。
@Component
@Qualifier("cold")
public class IceCream implements Dessert {...}
在注入的地方,只要引用cold限定符就可以了。
@Autowired
@Qualifier("cold") //引用自己设置的限定符
public void setDessert(Dessert dessert)
{
this.dessert = dessert;
}
假设我们现在有两个bean都带有”cold“限定符。自动装配时,Spring又会不知道怎么选择。
@Component
@Qualifier("cold")
public class Cookies implements Dessert {...}
@Component
@Qualifier("cold")
public class IceCream implements Dessert {...}
可能想到的解决方案就是再添加以个@Qualifier注解。
@Component
@Qualifier("cold")
@Qualifier("IceCream")
public class IceCream implements Dessert {...}
注入的时候,通过如下方式缩小范围:
@Autowired
@Qualifier("cold") //引用自己设置的限定符
@Qualifier("IceCream")//引用自己设置的限定符
public void setDessert(Dessert dessert)
{
this.dessert = dessert;
}
但是Java不允许在同一条目上重复出现相同类型的多个注解。这时我们将不在使用@Qualifier(“cold”),而是使用自定义的@cold注解。
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Cold {}
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface IceCream{}
注入时:
@Autowired
@Cold
@IceCream
public void setDessert(Dessert dessert)
{
this.dessert = dessert;
}
通过声明自定义的限定符注解,我们可以同时使用多个限定符。
可以把@Qualifier看成一个修饰词。
先写到这吧。比较匆忙,后续慢慢修改更新…….