一.属性自动装配

 首先,准备三个类,分别是User,Cat,Dog。其中User属性拥有Cat和Dog对象。

 1 package com.hdu.autowire;
 2
 3 public class User {
 4     private Cat cat;
 5     private Dog dog;
 6     private String str;
 7
 8     public Cat getCat() {
 9         return cat;
10     }
11     public void setCat(Cat cat) {
12         this.cat = cat;
13     }
14     public Dog getDog() {
15         return dog;
16     }
17     public void setDog(Dog dog) {
18         this.dog = dog;
19     }
20     public String getStr() {
21         return str;
22     }
23     public void setStr(String str) {
24         this.str = str;
25     }
26 }

1 package com.hdu.autowire;
2
3 public class Cat {
4     public void shout() {
5         System.out.println("miao~");
6     }
7 }

1 package com.hdu.autowire;
2
3 public class Dog {
4     public void shout() {
5         System.out.println("wang~");
6     }
7 }

测试代码:

 1 package com.hdu.test;
 2
 3 import org.junit.Test;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6
 7 public class TestIOCDI {
 8     @Test
 9     public void testMethodAutowire() {
10         ApplicationContext context = new ClassPathXmlApplicationContext("resources/spring_autowire.xml");
11         com.hdu.autowire.User user = context.getBean("user", com.hdu.autowire.User.class);
12         user.getCat().shout();
13         user.getDog().shout();
14     }
15 }

   1.1 xml配置文件

<bean id="cat" class="com.hdu.autowire.Cat"></bean>
<bean id="dog" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"><property name="cat" ref="cat"></property><property name="dog" ref="dog"></property><property name="str" value="haha"></property>
</bean>

    1.2 autowire byName (按名称自动装配)

由于在手动配置xml过程中,常常发生字母缺漏和大小写等错误,而无法对其进行检查,使得开发效率降低。采用自动装配将避免这些错误,并且使配置简单化。

  当一个bean节点带有 autowire byName的属性时。

    ①将查找其类中所有的set方法名,例如setCat,获得将set去掉并且首字母小写的字符串,即cat。

    ②去spring容器中寻找是否有此字符串名称id的对象。

    ③如果有,就取出注入;如果没有,就报空指针异常。

<bean id="cat" class="com.hdu.autowire.Cat"></bean>
<bean id="dog" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"autowire="byName">
</bean>

如果将 <bean id="cat" class="com.hdu.autowire.Cat"></bean> 改成

<bean id="catXXX" class="com.hdu.autowire.Cat"></bean>

执行时报空指针java.lang.NullPointerException。因为按byName规则找不对应set方法,真正的setCat就没执行,对象就没有初始化,所以调用时就会报空指针错误。

  1.3autowire byType (按类型自动装配)

使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。

<bean id="cat" class="com.hdu.autowire.Cat"></bean>
<bean id="dog" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"autowire="byType">
</bean>

将<bean id="cat" class="com.hdu.autowire.Cat"></bean> 改成

<bean id="catXXX" class="com.hdu.autowire.Cat"></bean>

因为是按类型装配,所以并不会报异常,也不影响最后的结果。

甚至将id属性去掉,也不影响结果。

<bean class="com.hdu.autowire.Cat"></bean>

 1.4全局autowire

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:p="http://www.springframework.org/schema/p"xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"  default-autowire="byName"><bean id="cat" class="com.hdu.autowire.Cat"></bean><bean id="dog" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User" autowire="default"/><bean id="user2" class="com.hdu.autowire.User" autowire="default"/><bean id="user3" class="com.hdu.autowire.User" autowire="default"/></beans>

二.属性注解

jdk1.5开始支持注解,spring2.5开始全面支持注解。

利用注解的方式注入属性。

①spring引入context文件头

②开启属性注解

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:p="http://www.springframework.org/schema/p"xmlns:util="http://www.springframework.org/schema/util"  xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:annotation-config/>
</beans>

 2.1 @Autowired

@Autowired是按类型自动转配的,不支持id匹配。

将User中的set方法去掉,加入@Autowired注解。

其中这里依赖一个的jar包。

 1 package com.hdu.autowire;
 2
 3 import org.springframework.beans.factory.annotation.Autowired;
 4
 5 public class User {
 6     @Autowired
 7     private Cat cat;
 8     @Autowired
 9     private Dog dog;
10     private String str;
11
12     public Cat getCat() {
13         return cat;
14     }
15
16     public Dog getDog() {
17         return dog;
18     }
19
20     public String getStr() {
21         return str;
22     }
23 }

<context:annotation-config/><bean id="catXXX" class="com.hdu.autowire.Cat"></bean>
<bean id="dogXXX" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"></bean>

@Autowired(required=false)

false,对象可以为null;true,对象必须存对象,不能为null。

2.2 @Qualifier

@Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配,其中@Qualifier不能单独使用。

 1 package com.hdu.autowire;
 2
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.beans.factory.annotation.Qualifier;
 5
 6 public class User {
 7     @Autowired
 8     @Qualifier(value="carXXX")
 9     private Cat cat;
10     @Autowired
11     @Qualifier(value="dogXXX")
12     private Dog dog;
13     private String str;
14
15     public Cat getCat() {
16         return cat;
17     }
18
19     public Dog getDog() {
20         return dog;
21     }
22
23     public String getStr() {
24         return str;
25     }
26 }

    2.3 @Resource

@Resource如有指定的name属性,先按该属性进行byName方式查找装配;其次再进行默认的byName方式进行装配;如果以上都不成功,则按byType的方式自动装配。都不成功,则报异常。

 1 package com.hdu.autowire;
 2
 3 import javax.annotation.Resource;
 4
 5 public class User {
 6     @Resource
 7     private Cat cat;
 8     @Resource(name="dogXXX")
 9     private Dog dog;
10     private String str;
11
12     public Cat getCat() {
13         return cat;
14     }
15
16     public Dog getDog() {
17         return dog;
18     }
19
20     public String getStr() {
21         return str;
22     }
23 }

配置文件1:

<bean id="catXXX" class="com.hdu.autowire.Cat"></bean>
<bean id="cat" class="com.hdu.autowire.Cat"></bean>
<bean id="dogXXX" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"></bean>

先进行byName查找,成功。

配置文件2:

<context:annotation-config/> <bean id="catXXX" class="com.hdu.autowire.Cat"></bean>
<bean id="dogXXX" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"></bean>

先进行byName查找,失败;再进行byType查找,成功。

配置文件3:

<bean id="catXXX" class="com.hdu.autowire.Cat"></bean>
<bean id="catYYY" class="com.hdu.autowire.Cat"></bean>
<bean id="dogXXX" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"></bean>

先进行byName查找,失败;再进行byType查找,有两个匹配,失败,报错。

    2.4小结:

@Autowired与@Resource异同:

1° @Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。

2° @Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用。

3° @Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。

三.类自动装配

 3.1 包扫描

注解替换bean节点
        @Controller注解       只能用控制器类上
        @Service注解           只能用在业务类上
        @Repository注解      只能用在dao类上
        @Component注解     无法按照上面三个注解分类,就用此注解

 1 package com.hdu.autowire;
 2
 3 import org.springframework.stereotype.Component;
 4
 5 @Component
 6 public class Cat {
 7     public void shout() {
 8         System.out.println("miao~");
 9     }
10 }

 1 package com.hdu.autowire;
 2
 3 import org.springframework.stereotype.Component;
 4
 5 @Component
 6 public class Dog {
 7     public void shout() {
 8         System.out.println("wang~");
 9     }
10 }

 1 package com.hdu.autowire;
 2
 3 import javax.annotation.Resource;
 4 import org.springframework.stereotype.Component;
 5
 6 @Component
 7 public class User {
 8     @Resource
 9     private Cat cat;
10     @Resource
11     private Dog dog;
12     private String str;
13
14     public Cat getCat() {
15         return cat;
16     }
17
18     public Dog getDog() {
19         return dog;
20     }
21
22     public String getStr() {
23         return str;
24     }
25 }

<!-- 解析注解@Controller@Service@Repository@Componentcomponent-scan:组件扫描base-package:基本包,指定包名,多个包名可以用逗号间隔也可以写多个<context:component-scan如果用了组件扫描后<context:annotation-config></context:annotation-config>就不用写了,组件扫描已经包含了 <context:annotation-config>
-->
<context:component-scan base-package="com.hdu.autowire"/>

测试:

 1 package com.hdu.test;
 2
 3 import org.junit.Test;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6
 7 import com.hdu.autowire.User;
 8
 9 public class TestIOCDI {
10     @Test
11     public void testMethodAutowire() {
12         ApplicationContext context = new ClassPathXmlApplicationContext("resources/spring_autowire.xml");
13         User user = context.getBean("user", User.class);
14         user.getCat().shout();
15         user.getDog().shout();
16     }
17 }

    3.2 类目和ID对应表:

类名:    CAT        cAT         CaT        caT

ID:          CAT         cAT        caT         caT

分析:类名的关键在于第二个字母,第二个字母大写,首字母大写小写无所谓。如果第二个字母小写,那第一个必须小写。第二个字母之后大小写没关系。

如果没有指定value,spring容器中id规则,是类名的首字母小写。

 3.3 自定义bean的id

@Component(value="cat")

四.其它注解

    4.1 @Value

jdbc_driverClass=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://localhost:3306/tmpdb
jdbc_userName=root
jdbc_userPassword=root

 4.1.1${}表达式

<context:component-scan base-package="com.hdu.util"></context:component-scan>
<!-- 用$表达式方式 -->
<context:property-placeholder location="classpath:/resources/mysql.properties"/>

 1 package com.hdu.util;
 2
 3 import org.springframework.beans.factory.annotation.Value;
 4 import org.springframework.stereotype.Component;
 5
 6 @Component("jdbcUtil")
 7 public class JDBCUtil {
 8     @Value("${jdbc_driverClass}")
 9     private String driverClass;
10     @Value("${jdbc_url}")
11     private String url;
12     @Value("${jdbc_userName}")
13     private String userName;
14     @Value("${jdbc_userPassword}")
15     private String password;
16     public String getDriverClass() {
17         return driverClass;
18     }
19
20     public String getUrl() {
21         return url;
22     }
23
24     public String getUserName() {
25         return userName;
26     }
27
28     public String getPassword() {
29         return password;
30     }
31
32     @Override
33     public String toString() {
34         return "JDBCUtil [driverClass=" + driverClass + ", url=" + url + ", userName=" + userName + ", password="
35                 + password + "]";
36     }
37
38
39
40 }

测试:

 1 package com.hdu.test;
 2
 3 import org.junit.Test;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6
 7 import com.hdu.util.JDBCUtil;
 8
 9 public class TestSpringIOCDI_Annoation {
10     @Test
11     public void testMethod() {
12         ApplicationContext context = new ClassPathXmlApplicationContext("resources/spring_annotation.xml");
13         JDBCUtil jdbcUtil = context.getBean("jdbcUtil", JDBCUtil.class);
14         System.out.println(jdbcUtil);
15     }
16 }

    4.1.2#{}表达式

<context:component-scan base-package="com.hdu.util"></context:component-scan>
<!-- 用#表达式方式 -->
<util:properties id="manyProperty" location="classpath:/resources/mysql.properties"></util:properties>

 1 package com.hdu.util;
 2
 3 import org.springframework.beans.factory.annotation.Value;
 4 import org.springframework.stereotype.Component;
 5
 6 @Component("jdbcUtil1")
 7 public class JDBCUtil1 {//@Value("#{manyProperty['jdbc_url']}")
 8     @Value("#{manyProperty.jdbc_driverClass}")
 9     private String driverClass;
10     @Value("#{manyProperty.jdbc_url}")
11     private String url;
12     @Value("#{manyProperty.jdbc_userName}")
13     private String userName;
14     @Value("#{manyProperty.jdbc_userPassword}")
15     private String password;
16     public String getDriverClass() {
17         return driverClass;
18     }
19
20     public String getUrl() {
21         return url;
22     }
23
24     public String getUserName() {
25         return userName;
26     }
27
28     public String getPassword() {
29         return password;
30     }
31
32     @Override
33     public String toString() {
34         return "JDBCUtil [driverClass=" + driverClass + ", url=" + url + ", userName=" + userName + ", password="
35                 + password + "]";
36     }
37
38 }

测试:

package com.hdu.test;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.hdu.util.JDBCUtil1;public class TestSpringIOCDI_Annoation {@Testpublic void testMethod() {//加载spring容器ApplicationContext context = new ClassPathXmlApplicationContext("resources/spring_annotation.xml");//从spring容器中取出对象JDBCUtil1 jdbcUtil = context.getBean("jdbcUtil1", JDBCUtil1.class);System.out.println(jdbcUtil);}
}

4.2 @Scope(value="prototype")// 单例和多例 修饰在类上

4.3 @Lazy //代表懒加载 修饰在类上

4.4 @PostConstruct //表示初始化操作 修饰在方法上

4.5 @PreDestroy //表示销毁 修饰在方法上

一.属性自动装配

 首先,准备三个类,分别是User,Cat,Dog。其中User属性拥有Cat和Dog对象。

 Class User
 Class Cat

1 package com.hdu.autowire;
2
3 public class Dog {
4     public void shout() {
5         System.out.println("wang~");
6     }
7 }

测试代码:

 1 package com.hdu.test;
 2
 3 import org.junit.Test;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6
 7 public class TestIOCDI {
 8     @Test
 9     public void testMethodAutowire() {
10         ApplicationContext context = new ClassPathXmlApplicationContext("resources/spring_autowire.xml");
11         com.hdu.autowire.User user = context.getBean("user", com.hdu.autowire.User.class);
12         user.getCat().shout();
13         user.getDog().shout();
14     }
15 }

   1.1 xml配置文件

<bean id="cat" class="com.hdu.autowire.Cat"></bean>
<bean id="dog" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"><property name="cat" ref="cat"></property><property name="dog" ref="dog"></property><property name="str" value="haha"></property>
</bean>

    1.2 autowire byName (按名称自动装配)

由于在手动配置xml过程中,常常发生字母缺漏和大小写等错误,而无法对其进行检查,使得开发效率降低。采用自动装配将避免这些错误,并且使配置简单化。

  当一个bean节点带有 autowire byName的属性时。

    ①将查找其类中所有的set方法名,例如setCat,获得将set去掉并且首字母小写的字符串,即cat。

    ②去spring容器中寻找是否有此字符串名称id的对象。

    ③如果有,就取出注入;如果没有,就报空指针异常。

<bean id="cat" class="com.hdu.autowire.Cat"></bean>
<bean id="dog" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"autowire="byName">
</bean>

如果将 <bean id="cat" class="com.hdu.autowire.Cat"></bean> 改成

<bean id="catXXX" class="com.hdu.autowire.Cat"></bean>

执行时报空指针java.lang.NullPointerException。因为按byName规则找不对应set方法,真正的setCat就没执行,对象就没有初始化,所以调用时就会报空指针错误。

  1.3autowire byType (按类型自动装配)

使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。

<bean id="cat" class="com.hdu.autowire.Cat"></bean>
<bean id="dog" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"autowire="byType">
</bean>

将<bean id="cat" class="com.hdu.autowire.Cat"></bean> 改成

<bean id="catXXX" class="com.hdu.autowire.Cat"></bean>

因为是按类型装配,所以并不会报异常,也不影响最后的结果。

甚至将id属性去掉,也不影响结果。

<bean class="com.hdu.autowire.Cat"></bean>

 1.4全局autowire

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:p="http://www.springframework.org/schema/p"xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"  default-autowire="byName"><bean id="cat" class="com.hdu.autowire.Cat"></bean><bean id="dog" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User" autowire="default"/><bean id="user2" class="com.hdu.autowire.User" autowire="default"/><bean id="user3" class="com.hdu.autowire.User" autowire="default"/></beans>

二.属性注解

jdk1.5开始支持注解,spring2.5开始全面支持注解。

利用注解的方式注入属性。

①spring引入context文件头

②开启属性注解

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:p="http://www.springframework.org/schema/p"xmlns:util="http://www.springframework.org/schema/util"  xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:annotation-config/>
</beans>

 2.1 @Autowired

@Autowired是按类型自动转配的,不支持id匹配。

将User中的set方法去掉,加入@Autowired注解。

其中这里依赖一个的jar包。

 1 package com.hdu.autowire;
 2
 3 import org.springframework.beans.factory.annotation.Autowired;
 4
 5 public class User {
 6     @Autowired
 7     private Cat cat;
 8     @Autowired
 9     private Dog dog;
10     private String str;
11
12     public Cat getCat() {
13         return cat;
14     }
15
16     public Dog getDog() {
17         return dog;
18     }
19
20     public String getStr() {
21         return str;
22     }
23 }

<context:annotation-config/><bean id="catXXX" class="com.hdu.autowire.Cat"></bean>
<bean id="dogXXX" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"></bean>

@Autowired(required=false)

false,对象可以为null;true,对象必须存对象,不能为null。

2.2 @Qualifier

@Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配,其中@Qualifier不能单独使用。

 1 package com.hdu.autowire;
 2
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.beans.factory.annotation.Qualifier;
 5
 6 public class User {
 7     @Autowired
 8     @Qualifier(value="carXXX")
 9     private Cat cat;
10     @Autowired
11     @Qualifier(value="dogXXX")
12     private Dog dog;
13     private String str;
14
15     public Cat getCat() {
16         return cat;
17     }
18
19     public Dog getDog() {
20         return dog;
21     }
22
23     public String getStr() {
24         return str;
25     }
26 }

    2.3 @Resource

@Resource如有指定的name属性,先按该属性进行byName方式查找装配;其次再进行默认的byName方式进行装配;如果以上都不成功,则按byType的方式自动装配。都不成功,则报异常。

 1 package com.hdu.autowire;
 2
 3 import javax.annotation.Resource;
 4
 5 public class User {
 6     @Resource
 7     private Cat cat;
 8     @Resource(name="dogXXX")
 9     private Dog dog;
10     private String str;
11
12     public Cat getCat() {
13         return cat;
14     }
15
16     public Dog getDog() {
17         return dog;
18     }
19
20     public String getStr() {
21         return str;
22     }
23 }

配置文件1:

<bean id="catXXX" class="com.hdu.autowire.Cat"></bean>
<bean id="cat" class="com.hdu.autowire.Cat"></bean>
<bean id="dogXXX" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"></bean>

先进行byName查找,成功。

配置文件2:

<context:annotation-config/> <bean id="catXXX" class="com.hdu.autowire.Cat"></bean>
<bean id="dogXXX" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"></bean>

先进行byName查找,失败;再进行byType查找,成功。

配置文件3:

<bean id="catXXX" class="com.hdu.autowire.Cat"></bean>
<bean id="catYYY" class="com.hdu.autowire.Cat"></bean>
<bean id="dogXXX" class="com.hdu.autowire.Dog"></bean><bean id="user" class="com.hdu.autowire.User"></bean>

先进行byName查找,失败;再进行byType查找,有两个匹配,失败,报错。

    2.4小结:

@Autowired与@Resource异同:

1° @Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。

2° @Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用。

3° @Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。

三.类自动装配

 3.1 包扫描

注解替换bean节点
        @Controller注解       只能用控制器类上
        @Service注解           只能用在业务类上
        @Repository注解      只能用在dao类上
        @Component注解     无法按照上面三个注解分类,就用此注解

 Class Cat
 Class Dog
 Class User
<!-- 解析注解@Controller@Service@Repository@Componentcomponent-scan:组件扫描base-package:基本包,指定包名,多个包名可以用逗号间隔也可以写多个<context:component-scan如果用了组件扫描后<context:annotation-config></context:annotation-config>就不用写了,组件扫描已经包含了 <context:annotation-config>
-->
<context:component-scan base-package="com.hdu.autowire"/>

测试:

 Test

    3.2 类目和ID对应表:

类名:    CAT        cAT         CaT        caT

ID:          CAT         cAT        caT         caT

分析:类名的关键在于第二个字母,第二个字母大写,首字母大写小写无所谓。如果第二个字母小写,那第一个必须小写。第二个字母之后大小写没关系。

如果没有指定value,spring容器中id规则,是类名的首字母小写。

 3.3 自定义bean的id

@Component(value="cat")

四.其它注解

    4.1 @Value

jdbc_driverClass=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://localhost:3306/tmpdb
jdbc_userName=root
jdbc_userPassword=root

 4.1.1${}表达式

<context:component-scan base-package="com.hdu.util"></context:component-scan>
<!-- 用$表达式方式 -->
<context:property-placeholder location="classpath:/resources/mysql.properties"/>

 1 package com.hdu.util;
 2
 3 import org.springframework.beans.factory.annotation.Value;
 4 import org.springframework.stereotype.Component;
 5
 6 @Component("jdbcUtil")
 7 public class JDBCUtil {
 8     @Value("${jdbc_driverClass}")
 9     private String driverClass;
10     @Value("${jdbc_url}")
11     private String url;
12     @Value("${jdbc_userName}")
13     private String userName;
14     @Value("${jdbc_userPassword}")
15     private String password;
16     public String getDriverClass() {
17         return driverClass;
18     }
19
20     public String getUrl() {
21         return url;
22     }
23
24     public String getUserName() {
25         return userName;
26     }
27
28     public String getPassword() {
29         return password;
30     }
31
32     @Override
33     public String toString() {
34         return "JDBCUtil [driverClass=" + driverClass + ", url=" + url + ", userName=" + userName + ", password="
35                 + password + "]";
36     }
37
38
39
40 }

测试:

 1 package com.hdu.test;
 2
 3 import org.junit.Test;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6
 7 import com.hdu.util.JDBCUtil;
 8
 9 public class TestSpringIOCDI_Annoation {
10     @Test
11     public void testMethod() {
12         ApplicationContext context = new ClassPathXmlApplicationContext("resources/spring_annotation.xml");
13         JDBCUtil jdbcUtil = context.getBean("jdbcUtil", JDBCUtil.class);
14         System.out.println(jdbcUtil);
15     }
16 }

    4.1.2#{}表达式

<context:component-scan base-package="com.hdu.util"></context:component-scan>
<!-- 用#表达式方式 -->
<util:properties id="manyProperty" location="classpath:/resources/mysql.properties"></util:properties>

 1 package com.hdu.util;
 2
 3 import org.springframework.beans.factory.annotation.Value;
 4 import org.springframework.stereotype.Component;
 5
 6 @Component("jdbcUtil1")
 7 public class JDBCUtil1 {//@Value("#{manyProperty['jdbc_url']}")
 8     @Value("#{manyProperty.jdbc_driverClass}")
 9     private String driverClass;
10     @Value("#{manyProperty.jdbc_url}")
11     private String url;
12     @Value("#{manyProperty.jdbc_userName}")
13     private String userName;
14     @Value("#{manyProperty.jdbc_userPassword}")
15     private String password;
16     public String getDriverClass() {
17         return driverClass;
18     }
19
20     public String getUrl() {
21         return url;
22     }
23
24     public String getUserName() {
25         return userName;
26     }
27
28     public String getPassword() {
29         return password;
30     }
31
32     @Override
33     public String toString() {
34         return "JDBCUtil [driverClass=" + driverClass + ", url=" + url + ", userName=" + userName + ", password="
35                 + password + "]";
36     }
37
38 }

测试:

package com.hdu.test;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.hdu.util.JDBCUtil1;public class TestSpringIOCDI_Annoation {@Testpublic void testMethod() {//加载spring容器ApplicationContext context = new ClassPathXmlApplicationContext("resources/spring_annotation.xml");//从spring容器中取出对象JDBCUtil1 jdbcUtil = context.getBean("jdbcUtil1", JDBCUtil1.class);System.out.println(jdbcUtil);}
}

4.2 @Scope(value="prototype")// 单例和多例 修饰在类上

4.3 @Lazy //代表懒加载 修饰在类上

4.4 @PostConstruct //表示初始化操作 修饰在方法上

4.5 @PreDestroy //表示销毁 修饰在方法上

转载于:https://www.cnblogs.com/cxhfuujust/p/10561394.html

Spring 自动装配及其注解相关推荐

  1. spring自动装配、注解

    spring自动装配 Spring 自动装配 byName 这种模式由属性名称指定自动装配.Spring 容器看作 beans,在 XML 配置文件中 beans 的 auto-wire 属性设置为 ...

  2. Spring—自动装配与注解自动装配

    目录 自动装配 Spring支持5种自动装配模式 演示自动装配 1. no 默认装配方式 2.使用 byName 自动装配 3.使用 byType 自动装配 4.使用 constructor 自动装配 ...

  3. (二)Spring自动装配

    Spring自动装配 为了减少XML的配置数量.Spring提供了几种技巧来解决这一问题: 自动装配(autowiring): 有助于减少<property>元素和<constroc ...

  4. Java的注解机制——Spring自动装配的实现原理

    JDK1.5加入了对注解机制的支持,实际上我学习Java的时候就已经使用JDK1.6了,而且除了@Override和@SuppressWarnings(后者还是IDE给生成的--)之外没接触过其他的. ...

  5. Spring自动装配----注解装配----Spring自带的@Autowired注解

    Spring自动装配----注解装配----Spring自带的@Autowired注解 父类 package cn.ychx;public interface Person {public void ...

  6. spring注解驱动开发-4 Spring 自动装配

    Spring 自动装配 前言 Spring 自动装配的几种方式 1.@Autowired @Qualifier("组件id") @Primary 2.@Resource方式 3.@ ...

  7. spring自动装配的3种注解

    1.@Autowired @Qualifier @Primary 2.@Resource 3.@Inject @Autowired 自动装配 自动装配: Spring利用依赖注入(DI),完成对IOC ...

  8. Spring自动装配注解

    Spring自动装配注解 注解 来源 特点与区别 备注 @Autowired Spring定义 Spring提供自动装配注解 @Autowired详解 @Resource(JSR250) java注解 ...

  9. Spring自动装配(基于注解)

    从 Java 5 开始,Java 增加了对注解(Annotation)的支持,它是代码中的一种特殊标记,可以在编译.类加载和运行时被读取,执行相应的处理.开发人员可以通过注解在不改变原有代码和逻辑的情 ...

最新文章

  1. 大华嵌入式硬盘录像机数据恢复工具
  2. 独家 | 手把手教你用Python 3创建用于机器学习开发的Linux虚拟机(附安装教程代码)
  3. Linux开发环境搭建之Java开发环境JDK安装配置
  4. github高级搜索
  5. python重复元素判定_20段极简Python代码:这些小技巧你都Get了么
  6. Electron中实现菜单、子菜单、以及自带操作事件
  7. java selenium_selenium 常见面试题以及答案(Java版)
  8. zabbix监控之Centos基于LNMP环境安装
  9. GMIC来了 HTC VIVE细化VR梦
  10. java简易记账软件_0006JavaSE简单的项目FamilyAccount家庭记账控制台应用程序
  11. 数据库系统概论-数据库编程与关系查询处理和查询优化
  12. mtr 检测网络 查看服务器网络是否丢包
  13. tpac100控制器设置教程_TP-link AC100控制器配置基础教程
  14. anaconda r 语言_anaconda 配置R语言
  15. 花生壳 动态域名 ssh
  16. 六度好友算法【转载】
  17. 行测-图形推理-2-黑白格类
  18. 祭奠自己逝去的三年时光
  19. 符号_和平精英名字特殊符号怎么打?哪些特色符号可以用?
  20. 【NDN基础】Networking Named Content 问题汇总

热门文章

  1. Linux vmstat命令详细解读
  2. Resharper的使用
  3. Bootstrap3.1开发的响应式个人简历模板
  4. 【C】浅谈strcpy
  5. 个人开发者帐号+wireless install 实现非app store程序的在线更新功能
  6. 借助 Debugging Tools 分析蓝屏故障原因
  7. 现成Android 5.0系统源代码
  8. Javascript Java C++系列
  9. 软件需求分析--三步走
  10. 45. GameProject9+输入检测