Spring注解方式实现IOC和DI

1.所谓注解就是给程序看的提示信息,很多时候用来作为轻量级的配置方式。


2.Spring中除了默认的使用xml配置文件的方式实现配置之外,也支持使用注解方式,这种方式效率更高,配置信息清晰,修改更方便,推荐使用。


引入context名称空间:
在myeclipse中导入spring-contextxx.xsd约束文件,要求Spring来管理。


3.使用类注解


使用Spring的类注解可以通过注解注册类为bean,省去了配置文件中的配置。


1)开启包扫描


在spring配置文件中,开启包扫描,指定spring自动扫描那些个包下的类。


2)使用注解注册bean


这个包中的类会在spring容器启动时自动被扫描。检测是否需要自动配置为bean。在配置的包中的类上使用@Component注解,则这个类会被自动注册为bean,使用当前类的class为bean的class,通常情况下使用类名首字母小写为的id。


3)bean的id


  可以使bean类实现BeanNameAware接口,并实现其中的setBeanName方法,spring容器会在初始化bean时,调用此方法告知当前bean的id。通过这个方式可以获取bean的id信息。
  通常情况下注解注册bean使用类名首字母小写为bean的id,但是如果类名的第二个字母为大写字母则首字母保留原样。
  也可以通过在@Component中配置value属性,明确的指定当前类在注册到spring时bean的id,例如:
@Component("per")(当只有一个value时可以不写"value=")
public class Person implements BeanNameAware{
    @Override
    public void setBeanName(String name){
       System.out.println(this.getClass().getName()+"="+name);
    }
}


4.使用属性注解


使用属性注解,可以为bean配置属性的注入过程,省去了在配置文件中手动进行注入配置的过程

注解注入的规则:首先按属性名字找,找不到按属性类型找,如果属性类型是个接口,去看有几个实现类,如果只有一个,那就直接注入;如果是0个或者是多个,都会抛异常


1)在配置文件中开启属性注解功能:

 

标签下添加标签


来开启


2)使用属性注解注入bean类型数据:


在bean中的属性上通过@Autowired注解来声明属性注入,也可以使用@Qualifier(value="cat")注解,明确的指定要注入哪个id的bean


3)属性注入bean类型数据的原理:


  当spring容器解析xml时,发现开启了属性注解,则会在创建bean时,检测属性上是否存在@Autowired注解,如果发现该注解,则会通过当前属性的名称寻找是否存在该id的bean,如果存在则注入进来,如果不存在,再检查是否存在和当前属性类型相同的bean,如果有则注入进来,如果没有则抛出异常
也可以使用@Resource(name="id")指定注入给定的bean,但是这种方式不建议使用


4)spring内置支持注入类型的注解方式的注入-非集合类型


如果类中包含例如int、long、String等spring内置可注入的类型时,可以使用@Value注解来注入。
例如:
@Value("999")
private int id;
但是这种方式将注入的值写死在了代码中,此时我们可以将这些值配置到一个properties文件中,再在spring中进行引入,例如:
properties文件中:id=888
xml文件中 location="classpath:/配置文件名.properties">
具体类中:
@Value("${id}")
private int id;


5)spring内置支持注入类型的注解方式的注入-集合类型


需要将集合类型的数据配置到spring配置文件中,在通过@Value引入
配置过程
将spring-util-xxx.xsd交给MyEclipse管理
在当前spring容器的配置文件中导入util名称空间
再通过适当的util标签注册数据


list集合:有序列表


v1
v2
v3
v4


set集合:去重


v1
v2
v3
v4
v1



map集合:新的键值覆盖旧的键值

 







再在类的属性中通过@Value注入赋值,@符号之后的值对应配置文件中的id
 

@Value("#{@l1}")
private List addr;
@Value("#{@s1}")
private Set addr;
@Value("#{@m1}")
private Map addr;


5.其他注解


1)@Scope(value="prototype")--->配置修饰的类的bean是单例还是多例,如果不配置默认为单例

@Component
@Scope("prototype")
public class Cat{

}


2)@Lazy--->配置修饰的类的bean采用懒加载机制


例如:

@Component
@Lazy
public class Cat{
    public Cat(){
        System.out.println("Cat被创建出来了");
    }
}


3)@PostConstruct


  在bean对应的类中修饰某个方法,将该方法声明为初始化方法,对象创建之后立即执行


4)@PreDestroy


  在bean对应的类中,修饰某个方法,将该方法声明为销毁的方法,对象销毁之前调用该方法
例如:

@Component
public class Cat{
    public Cat(){
        System.out.println("Cat被创建出来了");
    }
    
    @PostConstruct
    public void init(){
        System.out.println("Cat的初始化方法");
    }

    @PreDestroy
    public void destroy(){
        System.out.println("Cat的销毁方法");
    }  

}


5)@Controller@Service@Repository@Component


这四个注解的功能是完全相同的,都是用来修饰类,将类声明为Spring管理的
其中@Component一般认为是通用的注解
而@Controller用在软件分层中的控制层,一般用在web层
而@Service用在软件分层中的业务访问层,一般用在service层
而@Repository用在软件分层中的数据访问层,一般用在dao层

你可能感兴趣的:(个人粗浅理解之Frame,Spring)