Spring-IOC使用实例详解

 

实例12:引用外部属性文件

举例应用场景:对于数据库连接池,只需要创建一个连接池即可,从中获取连接对象。因此可以用IOC容器进行配置组件。

>数据库连接池的配置文件(dbconfig.properties)

jdbc.username=root
jdbc.password=root
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/customersdb
jdbc.driverClass=com.mysql.jdbc.Driver

>在IOC容器中引入Context名称空间

Spring-IOC使用实例详解_第1张图片

>通过 引入配置文件,其中classpath:固定用法表示引用类路径下的配置文件

>通过 ${ } 来动态获取配置文件中的value值,并且需要注意的是,为了防止username和Spring中自带的username发生冲突,因此在配置

文件中应该在所有key值前加前缀,来避免冲突






>最后在类文件中获取IOC容器,并在方法中通过getBean方法获取数据连接池对象,并调用其方法获得连接对象

public class IOCTest {
	ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext02.xml");
	@Test
	public void test02() throws SQLException {
		//		DataSource bean = (DataSource)ioc.getBean("dataSource");
				
		//按照类型获取组件,可以获取到这个类型下的所有实现类子类等
		DataSource bean = ioc.getBean(DataSource.class);
		System.out.println(bean.getConnection());
	}

}

>需要注意的是,刚才在编码过程中,出现了java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector的错误,出现错误原因是没有导入mchange-commons-java-0.2.11.jar。

 

实例13:基于XML的自动装配

举例应用场景:自动装配应用于自定义类型属性。假如一个类中的属性为自定义类,在Bean中配置时,可以通过进行手动装配。

自动装配:根据指定的装配规则,不需要明确指定,就可以让Spring自动将匹配的属性值注入Bean中。

装配模式:① autowire="default">:不自动装配

                  ② autowire="byName">:根据属性名称,在IOC容器中寻找id和该属性名称相同的Bean,注入到Bean中

                  ③ autowire="byType">:根据属性类型,在IOC容器中寻找类型相同的Bean,注入到Bean中

                  ④ autowire="constructor">:根据构造器中的参数,注入到Bean中。但是当一个Bean中存在多个构造器时就会很复杂,因此不建议使用。

大多时候会使用注解方式来实现自动装配,在XML文档中进行的自动装配会显得不方便,实际项目中更多使用注解的方式实现。

♥当一个类中的属性时自定义类型的集合时,当自动装配时,会将所有符合autowire条件的Bean都装入该集合中。

 

实例14:SpEL(Spring Expression Language)测试

SpEL的语法符号为:#{...}

>使用字面量进行赋值

>引用其他Bean的某个属性值


	
	
	
	

>引用其他Bean,(不需要ref=""来引用其他Bean)


	
	
	
	

>调用静态方法:#{T(全类名).静态方法名(参数)}


	
	

>调用非静态方法:#{对象.方法名}





	
	

※实例15:通过注解分别创建Dao、Service、Controller



 
 
@Controller
public class BookServlet {

}
public class IOCTest {

	ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
	/*
	 * 使用注解加入到容器中的组件,和使用配置加入到容器中的组件行为默认都是一样的;
	 * 1.组件的id,默认就是组件的类名首字母小写
	 * 2.组件的作用域,默认都是单例的
	 * >也可以新写组件的新名字通过()
	 * >也可以将组件的作用域改为多实例,@Scope(value="prototype")
	 * */
	@Test
	public void test() {
		Object bean = ioc.getBean("bookDao");
		Object bean1 = ioc.getBean("bookDao");
		System.out.println(bean == bean1);
		
	}

}

实例16:使用context:include-filter指定扫描包时要包含的类

实例17:使用context:include-filter指定扫描包时不包含的类

 
 













※实例18:使用@Autowired注解实现根据类型实现自动装配

/*
 * @Autowired:Spring会自动的为这个属性赋值;
 * 			一定会去容器中找到这个属性对应的组件

 * */
@Controller
public class BookServlet {
	
	//自动装配,自动的为这个属性赋值,不需要new一个对象
	@Autowired
	private BookService bookService;
	
}

@Autowired注解

    [1]根据类型实现自动装配。

    [2]构造器、普通字段(即使是非public)、一切具有参数的方法都可以应用@Autowired注解

    [3]默认情况下,所有使用@Autowired注解的属性都需要被设置。当Spring找不到匹配的bean装配属性时,会抛出异常。

    [4]若某一属性允许不被设置,可以设置@Autowired注解的required属性为 false

    [5]默认情况下,当IOC容器里存在多个类型兼容的bean时,Spring会尝试匹配bean的id值是否与变量名相同,如果相同则进行装配。如果bean的id值不相同,通过类型的自动装配将无法工作。此时可以在@Qualifier注解里提供bean的名称。Spring甚至允许在方法的形参上标注@Qualifiter注解以指定注入bean的名称。

    [6]@Autowired注解也可以应用在数组类型的属性上,此时Spring将会把所有匹配的bean进行自动装配。

    [7]@Autowired注解也可以应用在集合属性上,此时Spring读取该集合的类型信息,然后自动装配所有与之兼容的bean。

    [8]@Autowired注解用在java.util.Map上时,若该Map的键值为String,那么 Spring将自动装配与值类型兼容的bean作为值,并以bean的id值作为键。

※实例19:如果资源类型的bean不止一个,默认根据@Autowired注解标记的成员变量名作为id查找bean,进行装配

※实例20:如果根据成员变量名作为id还是找不到bean, 可以使用@Qualifier注解明确指定目标bean的id

public class BookServlet {
	
	//自动装配,自动的为这个属性赋值,不需要new一个对象
	//@Qualifier:指定一个名字作为该组件的id,让Spring不要使用变量名作为id
	@Qualifier("bookService")
	@Autowired
	private BookService bookServiceExt2;

}

※实例21:@Autowired注解的required属性指定某个属性允许不被设置:@Autowired(required="false")

总结@Autowired流程:

1>按照所注解的类型去Spring容器中寻找对应的组件:BookService bookService = ioc.getBean(BookService.class)

      (1)如果找到一个对应的组件,则赋值给变量bookService;

    (2)如果没找到,则抛出异常

      (3)如果找到多个(例如会将bookService所有的子类找出)

           ①根据变量名作为id继续匹配:

                             如果匹配上,则装配;匹配不上,则报错。

                                                                 如果想要根据变量名作为id继续匹配,可以使用@Qualifier("")指定一个新id

@Autowired和@Resource的区别

@Autowired:是Spring自己的注解,相比较来说功能强大一些,但如果离开Spring框架就不能使用

@Resource:是Java中的注解,扩展性强,如果换一个不是Spring的容器框架(例如EJB),该注解依然可以使用

 

使用Spring的单元测试

好处:不需要自己通过getBean方法获取组件,直接通过注解就可以让Spring自动装配

/*
 * 使用Spring的单元测试
 * 1.导包:导入Spring单元测试包 spring-test-4.0.0.RELEASE.jar
 * 2.@ContextConfiguration(LOCATION="")使用它来指定Spring的配置文件的位置
 * 3.@RunWith指定用那种驱动进行单元测试,默认是junit
 * 	@RunWith(org.springframework.test.context.junit4.SpringJUnit4ClassRunner.class)
 * 	使用Spring的单元测试模块来执行标了@Test注解的测试方法
 * 	以前@Test注解只是由junit执行,现在Spring中的单元测试模块会根据指定的配置文件自动帮你创建ioc容器
 * */
@ContextConfiguration(locations="classpath:applicationContext.xml")
@RunWith(org.springframework.test.context.junit4.SpringJUnit4ClassRunner.class)
public class IOCTest {

	//ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
	ApplicationContext ioc = null;
	@Autowired
	BookServlet bookServlet;
	
	
	@Test
	public void test() {
		System.out.println(bookServlet);
		
	}

}

实例23:测试泛型依赖注入

Spring 4.x中可以为子类注入子类对应的泛型类型的成员变量的引用。

Spring-IOC使用实例详解_第2张图片

你可能感兴趣的:(Spring框架,spring,java)