Spring注解方式实现IOC和DI

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


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


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


3.使用类注解


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


1)开启包扫描


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

<context:component-scan base-package="具体的包名"></context:component-scan>


2)使用注解注册bean


这个包中的类会在spring容器启动时自动被扫描。检测是否需要自动配置为bean。在配置的包中的类上使用@Component注解,则这个类会被自动注册为bean,使用当前类的class为bean的class,通常情况下使用类名首字母小写为<bean>的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)在配置文件中开启属性注解功能:

 

在<beans>标签下添加标签


<context:annotation-config></context:annotation-config>来开启


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文件中<context:property-placeholder
location="classpath:/配置文件名.properties">
具体类中:
@Value("${id}")
private int id;


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


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


list集合:有序列表

<util:list id="l1">
<value>v1</value>
<value>v2</value>
<value>v3</value>
<value>v4</value>
</util:list>


set集合:去重

<util:set id="s1">
<value>v1</value>
<value>v2</value>
<value>v3</value>
<value>v4</value>
<value>v1</value>
</util:set>



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

 

<util:map id="m1">
<entry key="k1" value="v1">
<entry key="k2" value="v2">
<entry key="k3" value="v3">
<entry key="k1" value="v4">
</util:map>


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

@Value("#{@l1}")
private List<String> addr;
@Value("#{@s1}")
private Set<String> addr;
@Value("#{@m1}")
private Map<String> 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层

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值