spring 随笔(一) bean & Dependency Injection(二)

2014-11-24 02:25:22 · 作者: · 浏览: 1
this.master = master; } public void sayMaster(){ System.out.println(master); } }

Person类:

public class Person {
	private Long id;
	private String name;
	private String mail;
	
	public String getMail() {
		return mail;
	}
	public void setMail(String mail) {
		this.mail = mail;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", mail=" + mail + "]";
	}
}

则可以这样给Family 类注入Person类的master属性值

     
		
      

      

2.2. 通过构造函数注入依赖

Person类:

package com.xiaohui.domain;

public class Person {
	private Long id;
	private String name;
	private String mail;
	
	public Person() {}
	public Person(Long id, String name, String mail) {
		this.id = id;
		this.name = name;
		this.mail = mail;
	}
	public String getMail() {
		return mail;
	}
	public void setMail(String mail) {
		this.mail = mail;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", mail=" + mail + "]";
	}
}

1.可以按照参数的类型注入,如:

     
    	
      
    	
      
    	
      

     

当一种类型有多个的种情况下其按照构造函数的参数顺序注入。如上,其第二个constructor-arg标签注入的为Person的name属性。

2.可以按照参数的name进行注入,如:

 
     
    	
      
    	
      
    	
      
 
     

其中name的值为该类的构造方法的参数名。正常情况下,通过软件自动生成的构造方法其参数名和对应的属性名是一样的。

3.可以按照索引(构造函数的参数顺序)进行注入

     
    	
      
    	
      
    	
      

     

2.3 通过自动装配的方式进行注入

通过设置bean标签中的autowire属性。

autowire的取值为:byType:按类型装配,可以根据属性的类型,在容器中寻找跟该类型匹配的bean。如果发现多个,那么将会抛出异常。如果没有找到,即属性值为null。

byName:按名称装配,可以根据属性的名称,在容器中寻找跟该属性名相同的bean,如果没有找到,即属性值为null。

constructor:与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

byType

autowire-candidate:可选值为 true|false 当autowire匹配时有多个类型的时候,使用该属性可以表明该bean是否为优先的候选bean 通常设置哪些bean不为优先候选的

     

     

     

     

byName bean的id要和依赖该bean的类中的属性名一样.

     

     

     

2.4 通过注解方式进行装配

在使用注解方式进行注入之前呢,必须现在spring配置文件applicationContext.xml中引入context命名空间

再在配置文件中加入 标签

     

     
	
	
      
	
      
	
      
	
      

     


常用的注解说明:

@Autowire & @Resource & @Qualifier

@Autowire和@Resource的区别是:@Autowired 默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。 相同的是:都可以直接使用在Field上或者setter方法之上。 @Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。 @Resource可以通过设置name属性指定注入bean的名称, 但一 旦指定了 name 属性,就只能按名称装配了 如果我们想使用按名称装配,可以让@Autowired结合@Qualifier注解一起使用。 对应Spring配置文件中的init-method和destory-method,在bean中,可以直接使用@PostConstruct和@PreDestory标签来标记生命周期方法。 public class CachingMovieLister { @PostConstruct public void populateMovieCache() { } @PreDestroy public void clearMovieCache() { } } 相当于: 更为简洁的bean管理方式:classpath自动扫描 在上面的配置中我们还需要在spring的xml文件中配置bean信息。spring为我们提供了另一种更为简洁的bean管理和依赖注入的的方式,成为classpath自动扫描。 使用@Component,@Controller,@Service,@Repository注释我们需要被spring管理的组件类
@Controller用于标注控制层组件(如struts中的action)。 @Service用于标注业务层组件。 @Repository用于标注数据访问组件,即DAO组件。 @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
这时我们在xml文件中只需要加入 ,这时我们就不用在xml中配置 base-package包下面的所有bean了。 xml如下:
     

     
	
      
	
             

     

java类如下: Dbutil类:
package com.xiaohui.myinject2;
import org.springframework.stereotype.Component;
@Component
public cl