Sprint注入和bean的自动装配以及Autowired的用法

来源:互联网 发布:php safe mode 编辑:程序博客网 时间:2024/06/06 03:49

1、Spring注入

Spring注入常用的有两种方式,第一种是设值注入,第二种是构造注入。

1、设值注入

配置文件
<?xml version="1.0" encoding="UTF-8"?>  <beans xmlns="http://www.springframework.org/schema/beans"         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.xsd">                      <bean id="book" class="com.wry.bean.Book"></bean>         <bean id="reader" class="com.wry.bean.Reader">          <property name="book" ref="book" />       </bean>  </beans>

Book.java

package com.wry.bean;public class Book {public void read(){System.out.println("readding book");}}
Reader.java

package com.wry.bean;public class Reader {private Book book;public void setBook(Book book) {this.book = book;}public void readBook(){book.read();}}

测试

public class Demo {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml"); Reader reader = (Reader)context.getBean("reader");reader.readBook();}}

2、构造器注入

配置文件

<?xml version="1.0" encoding="UTF-8"?>  <beans xmlns="http://www.springframework.org/schema/beans"         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.xsd">                      <bean id="book" class="com.wry.bean.Book"></bean>         <bean id="reader" class="com.wry.bean.Reader">          <constructor-arg name="book" ref="book" />       </bean>  </beans>

Book.java

package com.wry.bean;public class Book {public void read(){System.out.println("readding book");}}
Reader.java
package com.wry.bean;public class Reader {private Book book;public Reader(Book book){this.book = book;}public void readBook(){book.read();}}
测试
public class Demo {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml"); Reader reader = (Reader)context.getBean("reader");reader.readBook();}}

2、bean的自动装配

bean的自动装配有三种方式,第一种通过byName,第二种通过byType,第三种通过constructor。

1、通过byName

在Spring的配置文件头部加入default-autowire = “byName”,在xml中定义的bean不要property参数(或者constructor-arg)。
配置文件
<?xml version="1.0" encoding="UTF-8"?>  <beans xmlns="http://www.springframework.org/schema/beans"         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.xsd"           default-autowire = "byName">                      <bean id="book" class="com.wry.bean.Book"></bean>         <bean id="reader" class="com.wry.bean.Reader"></bean>  </beans> 
Book.java
package com.wry.bean;public class Book {public void read(){System.out.println("readding book");}}
Reader.java
package com.wry.bean;public class Reader {private Book book;public void setBook(Book book) {this.book = book;}public void readBook(){book.read();}}
测试
public class Demo {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml"); Reader reader = (Reader)context.getBean("reader");reader.readBook();}}

2、通过byType

在Spring的配置文件头部加入default-autowire = “byType”,因为是通过类型注入的,所以bean中的id可以改名称,当然也可以bean的id删除。
配置文件
<?xml version="1.0" encoding="UTF-8"?>  <beans xmlns="http://www.springframework.org/schema/beans"         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.xsd"           default-autowire = "byType">                      <bean class="com.wry.bean.Book"></bean>         <bean id="reader" class="com.wry.bean.Reader"></bean>  </beans> 
Book.java
package com.wry.bean;public class Book {public void read(){System.out.println("readding book");}}
Reader.java
package com.wry.bean;public class Reader {private Book book;public void setBook(Book book) {this.book = book;}public void readBook(){book.read();}}
测试
public class Demo {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml"); Reader reader = (Reader)context.getBean("reader");reader.readBook();}}

3、通过constructor

在Spring的配置文件头部加入default-autowire = “constructor”,因为是通过构造器注入的,所以bean中的id可以改名称,当然也可以bean的id删除。
配置文件
<?xml version="1.0" encoding="UTF-8"?>  <beans xmlns="http://www.springframework.org/schema/beans"         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.xsd"           default-autowire = "constructor">       <bean class="com.wry.bean.Book"></bean>         <bean id="reader" class="com.wry.bean.Reader"></bean>  </beans>
Book.java
package com.wry.bean;public class Book {public void read(){System.out.println("readding book");}}
Reader.java
package com.wry.bean;public class Reader {private Book book;public Reader(Book book){this.book = book;}public void readBook(){book.read();}}
测试
public class Demo {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml"); Reader reader = (Reader)context.getBean("reader");reader.readBook();}}

3、Autowired的用法

配置文件统一配置如下:
<?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.xsd           http://www.springframework.org/schema/context            http://www.springframework.org/schema/context/spring-context-3.0.xsd">       <context:component-scan base-package="com.wry.bean"></context:component-scan></beans>
Book.java代码统一如下:
package com.wry.bean;import org.springframework.stereotype.Component;@Componentpublic class Book {public void read(){System.out.println("readding book");}}
测试代码统一如下:
public class Demo {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml"); Reader reader = (Reader)context.getBean("reader");reader.readBook();}}

1、成员变量方式

Reader.javapackage com.wry.bean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;@Componentpublic class Reader {@Autowiredprivate Book book;public void readBook(){book.read();}}

2、set方法方式

package com.wry.bean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;@Componentpublic class Reader {private Book book;@Autowiredpublic void setBook(Book book) {this.book = book;}public void readBook(){book.read();}}

3、构造器方式

package com.wry.bean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;@Componentpublic class Reader {private Book book;@Autowiredpublic Reader(Book book){this.book = book;}public void readBook(){book.read();}}
Autowired的使用说明
1、默认情况下,如果因找不到合适的bean将会导致autowiring失败抛出异常,可以通过下面的方式避免:
@Componentpublic class Reader {@Autowired(required = false)private Book book;public void readBook(){book.read();}}
2、每个类只能有一个构造器被标记为required = true
3、可以注解那些众所周知的解析依赖性接口,比如:BeanFactory、ApplicationContext、Environment、ResourceLoader、ApplicationEventPublisher、MessageSource等。











0 0