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名称空间

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

<context:property-placeholder location="classpath:dbconfig.properties"/>

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

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

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
</bean>

>最后在类文件中获取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中配置时,可以通过<property name=" " ref=" IOC容器中的Bean"></property>进行手动装配。

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

装配模式:①<bean id=" " class=" " autowire="default"></bean>:不自动装配

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

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

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

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

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

 

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

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

>使用字面量进行赋值

<property name="count" value="#{5*12}"/>

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

<bean id="emp05" class="com.parent.bean.Employee">
	<property name="empId" value="1003"/>
	<property name="empName" value="Kate"/>
	<property name="age" value="21"/>
	<property name="deptName" value="#{dept.deptName}"/>
</bean>

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

<bean id="emp04" class="com.parent.bean.Employee">
	<property name="empId" value="1003"/>
	<property name="empName" value="Kate"/>
	<property name="age" value="21"/>
	<property name="detp" value="#{dept}"/>
</bean>

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

<bean id="employee" class="com.spel.bean.Employee">
	<!-- 在SpEL表达式中调用类的静态方法 -->
	<property name="circle" value="#{T(java.lang.Math).PI*20}"/>
</bean>

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

<!-- 创建一个对象,在SpEL表达式中调用这个对象的方法 -->
<bean id="salaryGenerator" class="com.spel.bean.SalaryGenerator"/>

<bean id="employee" class="com.spel.bean.Employee">
	<!-- 通过对象方法的返回值为属性赋值 -->
	<property name="salayOfYear" value="#{salaryGenerator.getSalaryOfYear(5000)}"/>
</bean>

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

<!-- 实例15:通过注解分别创建Dao、Service、Controller(控制器:控制网站跳转逻辑Servlet) -->
<!-- 通过给Bean上添加某些注解,可以快速的将Bean加入到IOC容器中
某个类上添加任何一个注解都能快速的将这个组件加入到IOC容器的管理中
Spring中有四个注解
@Controller:控制器:推荐给控制器层的组件添加该注解(Servlet包下)
@Service
@Rspository:给数据库层(持久化层,Dao层)的组件添加该注解
@Componet:WebUtils:给不属于以上基层的组件添加该注解

使用注解将组件快速加入容器中需要以下几步
1>给要添加的组件上标四个注解中的任一个
2>告诉Spring自动扫描加了注解的组件:依赖context名称空间
3>一定要导入AOP包,支持加注解模式的
 -->
 
 <!-- context:component-scan:自动组件扫描 -->
<context:component-scan base-package="com.cuco"></context:component-scan>
@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指定扫描包时不包含的类

 
 <!-- context:component-scan:自动组件扫描 -->
<context:component-scan base-package="com.cuco"></context:component-scan>

<!-- 实例17:使用context:include-filter指定扫描包时不包含的类 -->
<context:component-scan base-package="com.cuco">
<!-- 扫描时可以排除一些不要的组件 
	type="annotation":指定排除规则:按照注解进行排除,标注了指定注解的组件不要
	expression="":注解的全类名
	
	type="assignable":指定排除某个具体的类,按照类排除
	expression="":类的全类名
-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
<context:exclude-filter type="assignable" expression="com.cuco.service.BookService"/>
</context:component-scan>

<!-- use-default-filters设置为false:不扫描所有组件 -->
<context:component-scan base-package="com.cuco" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>

※实例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中可以为子类注入子类对应的泛型类型的成员变量的引用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring-beans模块是Spring框架中最基础的模块之一,提供了BeanFactory和FactoryBean等Bean管理相关的类。在Spring中,Bean指的是被Spring IoC容器管理的对象,而BeanFactory则是管理Bean的工厂类,是Spring IoC容器的核心组件之一。 Spring-beans模块的主要功能如下: 1. BeanFactory:BeanFactory是Spring IoC容器的核心接口,提供了获取Bean、注册Bean和销毁Bean等方法。BeanFactory是Spring IoC容器的基础,包括DefaultListableBeanFactory、XmlBeanFactory等实现类。 2. FactoryBean:FactoryBean是一种特殊的Bean,可以通过实现FactoryBean接口来自定义Bean的创建过程。FactoryBean的作用是在Bean的实例化过程中添加一些逻辑,例如对Bean进行缓存、延迟初始化等操作。 3. BeanPostProcessor:BeanPostProcessor是Spring IoC容器提供的扩展点,可以在Bean的初始化过程中添加一些自定义的逻辑。BeanPostProcessor提供了两个方法:postProcessBeforeInitialization和postProcessAfterInitialization,分别在Bean的初始化前后执行。 4. BeanDefinition:BeanDefinition是Spring IoC容器中定义Bean的元数据,包括Bean的类型、属性、依赖关系等信息。BeanDefinition是Spring IoC容器管理Bean的基础,可以通过BeanDefinition来实现Bean的配置、管理和装配。 除了以上功能,Spring-beans模块还提供了很多其他的类和接口,如BeanWrapper、BeanNameAware、InitializingBean和DisposableBean等,用于实现Bean的属性注入、生命周期管理和销毁等操作。 总之,Spring-beans模块是Spring框架中最基础的模块之一,提供了Bean管理相关的类和接口,是Spring IoC容器的核心组件之一,使用Spring框架时必须引入该模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值