用注解的方式来简化配置
组件扫描@Component("bean的id,默认缺省值为类名首字母小写")
什么时组件扫描?
如何使用组件扫描
step1:在类前面添加相应的注解
Student.java
@Component("stu1")
public class Student {
public Student() {
System.out.println("Student类的空参构造----注解方式");
}
}
step2:在配置文件中进行配置组件扫描
annotation.xml
<!-- 配置组件扫描
Component组件扫描:
Spring启动容器之后,会扫描base-package指定的包及其子包下面的所有的类,如果这些类前面添加了特定的注解,
比如添加了@Component,则容器会将该类实例化(即纳入容器进行管理)
-->
<context:component-scan base-package="cn.huang.annotation"/>
@Test
public void test1(){
ApplicationContext ac = new ClassPathXmlApplicationContext("annotation.xml");
//bean的id在Student.java中通过@Component("stu1")配置,默认缺省值为类名首字母小写
Student student = ac.getBean("stu1", Student.class);
System.out.println(student);
}
- 常用注解:
- @Component 通用注解
- @Service 用于业务层
- @Repository 用于持久层(数据访问层)
- @Controller 用于控制层
使用注解指定作用域
@Scope("singleton/prototype"),默认缺省值为singleton
@Component("stu1")
@Scope("prototype")
public class Student {
public Student() {
System.out.println("Student类的空参构造----注解方式");
}
}
使用注解指定生命周期----借用javaee的注解,需要导包
-
@PostConstruct
-
@PreDestroy
-
必须指定作用域为singleton
@Component("stu1") @Scope("singleton" public class Student { public Student() { System.out.println("Student类的空参构造----注解方式"); } @PostConstruct public void init(){ System.out.println("Student的init()初始化方法"); } @PreDestroy public void destroy(){ System.out.println("Student的destroy()销毁方法"); } }
使用注解指定延迟加载
- @Lazy(true)
使用注解依赖注入
@Aotuwired和@Qualifier
-
1)set方法注入
@Component("wt") public class Waiter { public Waiter(){ System.out.println("Waiter的无参构造器"); } } @Component("rest") public class Restaurant { private Waiter wt; /** * 如果只使用Aotowired一个属性,则依据byType来查找对象, * 再加Qualifier,则按照byName(wt---寻找bean的id=wt)的方式来找, * @param wt */ @Autowired public void setWt(@Qualifier("wt") Waiter wt) { System.out.println("Restaurant的setWt()方法"); this.wt = wt; } public Restaurant(){ System.out.println("Restaurant的无参构造器"); } @Override public String toString() { return "Restaurant [wt=" + wt + "]"; } }
-
AutoWired(set方法前)和Qualifier(参数前)结合使用,不然只使用AutoWired按找byType来查找可能会找到多个bean,使用Qualifier("注入bean的id")
-
或者直接再属性前面使用两个注解,省略set方法
@Autowired @Qualifier("wt") private Waiter wt;
加在属性前,只是单纯的赋值
-
-
2)构造方法注入
@Autowired public Leader(@Qualifier("wt") Waiter wt) { System.out.println("Leader的带参构造器"); this.wt = wt; }
-
Autowired和Qualifier总结:
- 这两个注解支持set方法和构造器方法注入
- 在使用set方法注入时,Autowired可加到set或者属性前,Qualifier用来指定被注入的bean的id,如果不适用Qualifier,则按照byType方式来查找相同对应的bean进行注入
- 在构造器注入时,这两个注解要家到构造器前面
-
3)@Resource(重点----实际开发中应用的较多)
@Component("eg") public class Enginee { public Enginee() { System.out.println("Enginee的无参构造器"); } } @Component("car") public class Car { private Enginee eg; //不加name时,byName-->byType,指定name之后,寻找该name对应的id的bean @Resource(name="eg") public void setEg(Enginee eg) { System.out.println("Car的setEg()方法"); this.eg = eg; } public Car() { System.out.println("Car的无参构造器"); } @Override public String toString() { return "Car [eg=" + eg + "]"; } } --------------------------------------------------------------- 该注解也可以直接加在属性前面,做简单的赋值
-
-
4)@Inject/@Name(基本不用) 来源于javaee,
注入基本类型的值Value
-
注入基本数据类型,在属性的set方法上加@Value("值"),注入基本类型
@Value("黄志宏") public void setName(String name) { this.name = name; } @Value("23") public void setAge(int age) { this.age = age; } -------------------------或者直接将注解加到属性前-------------------------- @Value("花花") private String name; @Value("23") private int age;
-
注入Spring表达式
@Value("#{config.pagesize}") private int pageSize;