Spring注解实现IOC(DI)
1.注解
所谓注解就是给程序看的提示信息,很多时候都用来作为轻量级配置的方式,注解本身不起什么作用,起作用的是在加载class文件时根据注解实现相应的功能。
2.Spring中的注解:
Spring除了默认的使用xml配置文件的方式实现配置之外,也支持使用注解方式实现配置,这种方式效率更高,配置信息清晰,修改更方便,推荐使用。
使用类注解:
所谓类注解,指的是spring中在类上加上注解,进行<bean>的声明,省去了配置文件中进行<bean>更加简单方便。
类注解使用流程:
<context:component-scan base-package="cn.tedu.beans"/>
2.使用注解声明<bean>,
在开启包扫描下的类上加上Spring特定的注解进行声明:
注解@Component用于声明Bean,这个类会被声明为bean,id默认是该类名,首字母小写:
@Component
public class Person{
}
可以进行注解id的设置:@Component("p")
bean的id
可以使bean类实现BeanNameAware接口,并实现其中的setBeanName方法,spring容器会在初始化bean时,调用此方法告知当前bean的id。通过这个方式可以获取bean的id信息
@Component("per")
public class Person implements BeanNameAware{
@Override
public void setBeanName(String name) {
System.out.println("==="+this.getClass().getName()+"==="+name);
}
}
id的配置事项:
通常情况下注解注册bean使用类名首字母小写为bean的id,但是如果类名的第二个字母为大写则首字母保留原样.
cn.nan.beans.Person --> <bean id="person" class="cn.nan.beans.Person"/>
cn.nan.beans.NBA --> <bean id="NBA" class="cn.nan.beans.NBA"/>
使用属性注入:
使用属性注解,可以为bean配置属性的注入过程,省去了在配置文件中进行注入的过程。
属性注解使用流程:
在配置文件中开启属性注解:
<context:annotation-config></context:annotation-config>
在想要注入的属性上使用@Autowired修饰;
public class DIDemo {
@Autowired
private Person p1;
也可以在下面接着使用@Qualifier("p1")注解,明确知道,要注入那个id的bean。
**也可以使用@Resource(name="id")指定注入给定id的bean,这种是java提供的一种注解形式。
属性注解使用原理:
当spring容器解析xml时,发现开启了属性注解,则会在创建bean是,检测属性上是否存在@Autowired注解,如果发现该注解,则会通过当前属性的名称寻找是否存在该id的bean,如果存在则进行注入,如果不存在则以byType进行检查,如果存在则注入,无则抛出异常。
注入非bean类型的属性:
@Value
@Component("per")
public class Person implements BeanNameAware{
@Value("999")
private int id;
}
这种方式不灵活,写死在了程序中。
可以将值配置到一个propertirs配置文件中,再在spring中进行写入。
spring文件中开启配置文件定位:
<context:property-placeholder location="classpath:/person.properties"/>
进行注入:
其他注解类型:
这四个注解的功能是完全相同的,都是用来修饰类,将类声明为Spring管理的bean的。
其中@Component一般认为是通用的注解
而@Controller用在软件分层中的控制层,一般用在web层
而@Service用在软件分层中的业务访问层,一般用在service层
而@Repository用在软件分层中的数据访问层,一般用在dao层
- @Controller @Service @Repository @Component
- @Scope("prototype"):配置修饰的类是单例还是多例的bean
- @Lazy:配置修饰的类的加载时懒加载
- @PostConstruct:在bean对应的类中 修饰某个方法 将该方法声明为初始化方法。
- @PreDestroy:在bean对应的类中 修饰某个方法 将该方法声明为销毁的方法
- 在Spring的配置文件中,开启包扫描,指的spring自动扫描那些个包下的类。