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")

beanid

可以使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使用类名首字母小写为beanid,但是如果类名的第二个字母为大写则首字母保留原样.

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注解实现IOC(DI)

 

spring文件中开启配置文件定位:

<context:property-placeholder location="classpath:/person.properties"/>

进行注入:

Spring注解实现IOC(DI)

 

其他注解类型:

这四个注解的功能是完全相同的,都是用来修饰类,将类声明为Spring管理的bean的。

其中@Component一般认为是通用的注解

而@Controller用在软件分层中的控制层,一般用在web层

而@Service用在软件分层中的业务访问层,一般用在service层

而@Repository用在软件分层中的数据访问层,一般用在dao层

  • @Controller @Service @Repository @Component
  • @Scope("prototype"):配置修饰的类是单例还是多例的bean
  • @Lazy:配置修饰的类的加载时懒加载
  • @PostConstruct:在bean对应的类中 修饰某个方法 将该方法声明为初始化方法。
  • @PreDestroy:在bean对应的类中 修饰某个方法 将该方法声明为销毁的方法
  • Spring的配置文件中,开启包扫描,指的spring自动扫描那些个包下的类。