1. 注解概念
        所谓注解就是给程序看的提示信息,很多时候都用来作为轻量级配置的方式。
        关于注解的知识点,参看java基础课程中java基础加强部分的内容。
    2. Spring中的注解
        Spring除了默认的使用xml配置文件的方式实现配置之外,也支持使用注解方式实现配置,这种方式效率更高,配置信息清晰,修改更方便,推荐使用。
        
        引入context名称空间:
            在MyEclipse中导入spring-context-3.2.xsd约束文件,要求Spring来管理。
            在applicationContext.xml文件中,引入该schema文件:

                1     <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:context="http://www.springframework.org/schema/context"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
7 http://www.springframework.org/schema/context
8 http://www.springframework.org/schema/context/spring-context-3.2.xsd
9 ">
10 </beans>

**可以将以上头信息加入MyEclipse模版,方便后续自动生成。
    
    3. 使用类注解
        使用Spring的类注解可以通过注解注册类为bean,省去了配置文件中的<bean>配置。
        
        a. 开启包扫描
        在spring的配置文件中,开启包扫描,指定spring自动扫描哪些个包下的类。
            <context:component-scan base-package="cn.tedu.beans"/>
        案例:

            <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
">
<!-- 开启包扫描 -->
<context:component-scan base-package="cn.tedu.beans"></context:component-scan>
<!--
<bean id="person" class="cn.tedu.beans.Person"></bean>
<bean id="cat" class="cn.tedu.beans.Cat"></bean>
<bean id="dog" class="cn.tedu.beans.Dog"></bean>
-->
</beans>

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

                package cn.tedu.beans;
import org.springframework.stereotype.Component; @Component
public class Person{
}

c. bean的id
            可以使bean类实现BeanNameAware接口,并实现其中的setBeanName方法,spring容器会在初始化bean时,调用此方法告知当前bean的id。通过这个方式可以获取bean的id信息。
            
            通常情况下注解注册bean使用类名首字母小写为bean的id,但是如果类名的第二个字母为大写则首字母保留原样.
                cn.tedu.beans.Person --> <bean id="person" class="cn.tedu.beans.Person"/>
                cn.tedu.beans.NBA --> <bean id="NBA" class="cn.tedu.beans.NBA"/>
            也可以通过在@Component中配置value属性,明确的指定当前类在注册到spring时bean的id
            案例:

                package cn.tedu.beans;

                 import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; @Component("per")
public class Person implements BeanNameAware{
@Override
public void setBeanName(String name) {
System.out.println("==="+this.getClass().getName()+"==="+name);
}
}

    4. 使用属性注解
        使用属性注解,可以为bean配置属性的注入过程,省去了在配置文件中进行注入配置的过程,更加便捷。
        
        a. 在配置文件中开启属性注解功能

          <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
">
<!-- 开启属性注解 -->
<context:annotation-config></context:annotation-config>
</beans>

b. 使用属性注解注入bean类型数据:
            在bean中的属性上通过如下注解声明属性注入
                @Autowired
            也可以使用@Qualifier(value="dog1")注解,明确的指定,要注入哪个id的bean
            
            代码:

    package cn.tedu.beans;

                import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; public class Person implements BeanNameAware{
@Autowired
private Dog dog;
@Autowired
private Cat cat; public Dog getDog() {
return dog;
}
public void setDogx(Dog dog) {
this.dog = dog;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
@Override
public String toString() {
return "Person [dog=" + dog + ", cat=" + cat + "]";
} @Override
public void setBeanName(String name) {
System.out.println("=============="+this.getClass().getName()+"===="+name);
} }

c. 属性注入bean类型数据的原理:
            当spring容器解析xml时,发现开启了属性注解,则会在创建bean时,检测属性上是否存在@Autowired注解,如果发现该注解,则会通过当前属性的名称寻找是否存在该id的bean,如果存在则注入进来,如果不存在,再检查是否存在和当前属性类型相同的bean,如果由则注入进来,如果都没有则抛出异常.
            
            **也可以使用@Resource(name="id")指定注入给定id的bean,但是这种方式不建议大家使用。
            
        d. spring内置支持注入类型的注解方式的注入 - 非集合类型
            spring中可以通过注解方式 注册bean,并可以通过@Autowired实现属性的自动注入,但注入的都是自定义的bean类型,如果类中包含例如 int long String等spring内置可注入的类型时,又该如何注入呢? 可以使用@Value注解来实现注入。

 package cn.tedu.beans;

                 import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; @Component("per")
public class Person implements BeanNameAware{
@Value("999")
private int id; @Value("zs")
private String name; @Autowired
private Dog dog; @Autowired
private Cat cat; public Dog getDog() {
return dog;
}
public void setDogx(Dog dog) {
this.dog = dog;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
} @Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", dog=" + dog
+ ", cat=" + cat + "]";
}
@Override
public void setBeanName(String name) {
System.out.println("==="+this.getClass().getName()+"==="+name);
} }

这种方式可以实现spring内置类型的注入,但是这种方式将注入的值写死在了代码中,后续如果希望改变注入的初始值,必须来修改源代码,此时可以将这些值配置到一个properties配置文件中,再在spring中进行引入。
                
            
                
                
                
            
        e. spring内置支持注入类型的注解方式的注入 - 集合类型
            需要将集合类型的数据配置到spring配置文件中,再通过@Value引入
            配置过程:
                将spring-util-3.2.xsd交给MyEclipse管理
                在当前spring容器的配置文件中导入util名称空间
                再通过适当的util标签注册数据
            案例:

     <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.2.xsd
">
<!-- 开启属性注解 -->
<context:annotation-config></context:annotation-config>
<context:component-scan base-package="cn.tedu.beans"></context:component-scan>
<context:property-placeholder location="classpath:/person-data.properties"/> <util:list id="l1">
<value>北京</value>
<value>上海</value>
<value>广州</value>
<value>深证</value>
</util:list> <util:set id="s1">
<value>法师</value>
<value>射手</value>
<value>打野</value>
<value>战士</value>
<value>打野</value>
<value>坦克</value>
<value>打野</value>
</util:set> <util:map id="m1">
<entry key="k1" value="v1"></entry>
<entry key="k2" value="v2"></entry>
<entry key="k3" value="v3"></entry>
<entry key="k1" value="v4"></entry>
</util:map>
</beans> 再在类的属性中通过@Value注入赋值
package cn.tedu.beans; import java.util.List;
import java.util.Map;
import java.util.Set; import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; @Component("per")
public class Person implements BeanNameAware{
@Value("${id}")
private int id; @Value("${name}")
private String name; @Value("#{@l1}")
private List<String> addr; @Value("#{@s1}")
private Set<String> jobs; @Value("#{@m1}")
private Map<String,String> map; @Autowired
private Dog dog; @Autowired
private Cat cat; public Dog getDog() {
return dog;
}
public void setDogx(Dog dog) {
this.dog = dog;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
} public void setBeanName(String name) {
System.out.println("=============="+this.getClass().getName()+"===="+name);
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", addr=" + addr
+ ", jobs=" + jobs + ", map=" + map + ", dog=" + dog + ", cat="
+ cat + "]";
}
}

    5. 其他注解
        a. @Scope(value="prototype")
            配置修饰的类的bean是单例还是多例,如果不配置默认为单例
            案例:

                 package cn.tedu.beans;

                 import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; @Component
@Scope("prototype")
public class Dog { }

b. @Lazy
            配置修饰的类的bean采用懒加载机制
            案例:

                 package cn.tedu.beans;

                 import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; @Component
@Lazy
public class Dog {
public Dog() {
System.out.println("Dog...被创建出来了...");
}
}

c. @PostConstruct
            在bean对应的类中 修饰某个方法 将该方法声明为初始化方法,对象创建之后立即执行。
        d. @PreDestroy
            在bean对应的类中 修饰某个方法 将该方法声明为销毁的方法,对象销毁之前调用的方法。
            案例:

   package cn.tedu.beans;

                 import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import org.springframework.stereotype.Component; @Component
public class Dog {
public Dog() {
System.out.println("Dog...被创建出来了...");
} @PostConstruct
public void init(){
System.out.println("Dog的初始化方法。。。");
} @PreDestroy
public void destory(){
System.out.println("Dog的销毁方法。。。");
}
}

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

Spring知识点总结(三)之注解方式实现IOC和DI的更多相关文章

  1. Spring 注解方式 实现 IOC 和 DI

    注:以下所有测试案例(最后一个除外)的测试代码都是同一个: package cn.tedu.test; import org.junit.Test; import org.springframewor ...

  2. (转)Spring的bean管理(注解方式)

    http://blog.csdn.net/yerenyuan_pku/article/details/69663779 Spring的bean管理(注解方式) 注解:代码中的特殊标记,注解可以使用在类 ...

  3. spring Bean的三种配置方式

    Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java Config 添加spring的maven repository <dependency> ...

  4. Spring 的 Bean 管理(注解方式)

    Spring 的 Bean 管理(注解方式) 1. 导入必要的 jar 包和 xml 文件 使用注解需要导入 spring-aop 的 jar 包. applicationContext.xml 文件 ...

  5. 【Spring】XML方式实现(无参构造 有参构造)和注解方式实现 IoC

    文章目录 Spring IoC的实现方式 XML方式实现 通过无参构造方法来创建 1.编写一个User实体类 2.编写我们的spring文件 3.测试类 UserTest.java 4.测试结果 通过 ...

  6. Spring 使用纯注解方式完成IoC

    目录 创建一个简单的Person类 使用xml方式配置Spring容器并获取bean的过程 创建xml配置文件 进行测试 使用纯注解方式配置Spring容器并获取bean的过程 创建spring配置类 ...

  7. 你可能使用了Spring最不推荐的注解方式

    前言 使用Spring框架最核心的两个功能就是IOC和AOP.IOC也就是控制反转,我们将类的实例化.依赖关系等都交由Spring来处理,以达到解耦合.利用复用.利于测试.设计出更优良程序的目的.而对 ...

  8. Spring常用的三种注入方式

    好文要收藏,摘自:https://blog.csdn.net/a909301740/article/details/78379720 Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入 ...

  9. Spring的bean管理(注解方式)

    注解:代码中的特殊标记,注解可以使用在类.方法.属性上面,使用注解可实现一些基本的功能.注解的写法是@注解名称(属性=属性值). 使用注解创建对象 第一步,创建Web项目,引入Spring的开发包 第 ...

随机推荐

  1. git使用方法记录

    git是一个分布式的代码版本管理系统,使用起来的确很方便,已签只会star别人的项目,今天刚好有空抽点时间学了一下,简单的几个命令的用法. 首先在giuhub上可以托管代码,然后可以将远程仓库拖到本地 ...

  2. Javascript模块化编程(三)require.js的用法及功能介绍

    这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战.我采用的是一个非常流行的库require.js感兴趣的朋友可以了解下啊 我采用的是一个非常流行的 ...

  3. js实现选中当前元素并改变颜色(js、jq的各种循环)

    1.jq伪类选择器(:not)的使用 2.js jq运用数组循环 3.checkbox的选中循环事件 4.select的选中事件 <select class="ssss" o ...

  4. js之闭包

    函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个对Array的求和.通常情况下,求和的函数是这样定义的: function sum(arr) { ret ...

  5. js之变量介绍

    变量提升 JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部: 'use strict'; function foo() { var x = 'He ...

  6. cf375D. Tree and Queries(莫队)

    题意 题目链接 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. Sol 想到了主席树和启发式 ...

  7. Node 的fs模块

    这个fs.readdir路径要加上__dirname  找到绝对路径  否则会报错 { Error: ENOENT: no such file or directory, scandir '/User ...

  8. 原生js的math对象

    Math对象方法 //返回最大值 var max=Math.max(95,93,90,94,98); console.log(max); //返回最小值 var min=Math.min(95,93, ...

  9. Grunt压缩图片和JS

    今天我们来说一下用Grunt来压缩图片和JS吧! 首先要安装插件: 这是压缩图片的; npm install --save-dev gulp-imagemin 这是压缩JS的: npm install ...

  10. ArcGisJS实现地图常用工具条、距离测量和面积测量(非官方实例)

    常用地图工具包括:平移.拉框缩小.拉框放大.全图.距离测量.面积测量.清除标记,距离测量.面积测量没有使用官方自带的组件代码. 1.距离测量 2.面积测量 3.源代码 <!DOCTYPE htm ...