spring学习总结1

博文参考链接:https://www.yiibai.com/spring/spring-auto-wiring-beans-with-autowired-annotation.html

//什么是spring

参考链接:https://blog.csdn.net/qq_22172133/article/details/81487134

spring 是一个开源框架,核心为 IOC(依赖注入/控制反转),AOP(面向切面)

这两个概念后面会详细介绍

//spring优点

1.方便解耦,对依赖对象的创建和管理交给spring容器

2.aop面向切面编程,对通用的异常,监控等进行统一的管理

3.声明式事务,方便事务管理

4.方便程序测试,Spring对Junit4支持,可以通过注解方便的测试Spring程序

spring  IOC使用方法:

依赖注入与自动装配的区别

依赖注入是为引用的对象进行赋值,自动装配是进行赋值时的一种方法

如:

public class Customer 
{
	private Person person;
	
	public Customer(Person person) {
		this.person = person;
	}
	
	public void setPerson(Person person) {
		this.person = person;
	}
	//...
}
public class Person 
{
	//...
}

<bean id="customer" class="com.yiibai.common.Customer" autowire="byName" />	
<bean id="person" class="com.yiibai.common.Person" />
其中红色部分是一个依赖注入,Customer类引用了Person类,所以注入了person对象,自动装配模式为 byName,即为这个引用对象(person)赋值时采用的是按名称匹配的方法

依赖注入有两种:setter, 构造器  

自动装配有五种:

  • no – 缺省情况下,自动配置是通过“ref”属性手动设定
     <bean id="customer" class="com.yiibai.common.Customer">
                  <property name="person" ref="person" />
	</bean>

	<bean id="person" class="com.yiibai.common.Person" />
  • byName – 根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。
    • <bean id="customer" class="com.yiibai.common.Customer" autowire="byName" />	
      <bean id="person" class="com.yiibai.common.Person" />
  • byType – 按数据类型自动装配。如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。
    • <bean id="customer" class="com.yiibai.common.Customer" autowire="byType" />
      <bean id="person" class="com.yiibai.common.Person" />
    • 如果有多个相同类型,装配时会报错,因为spring不知道应该注入哪个
    • <bean id="customer" class="com.yiibai.common.Customer" autowire="byType" />
      <bean id="person" class="com.yiibai.common.Person" />
      <bean id="student" class="com.yiibai.common.Person" />
    • 标红部分为两个相同类型(Person)按类型注入会报错
  • constructor – 在构造函数参数的byType方式。
  •         <bean id="customer" class="com.yiibai.common.Customer" autowire="constructor" />
    	
    	<bean id="person" class="com.yiibai.common.Person" />
    • 按构造函数注入,实际上是根据构造函数中参数的类型进行匹配(因此,如果有多个类型相同的bean,注入时也会报错)
  • autodetect – 如果找到默认的构造函数,使用“自动装配用构造”; 否则,使用“按类型自动装配”
  • 参考链接:https://www.yiibai.com/spring/spring-autowiring-by-autodetect.html

以上为通过xml进行配置,下面介绍下通过注解配置

@Autowired

可以用于 setter方法,构造函数,属性字段

public class Customer 
{
@Autowired 用于属性字段 private Person person; /*@Autowired 用于构造函数 public Customer(Person person) { this.person = person; }*/ /*@Autowired 用于setter方法 public void setPerson(Person person) { this.person = person; }*/ //... }
public class Person 
{
	//...
}

@Autowired注解是通过匹配数据类型自动装配Bean

想要使用@Autowired注解,有两种方法

1.xml引入如下配置

<beans 
	//...
	xmlns:context="http://www.springframework.org/schema/context"
	//...
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	//...

	<context:annotation-config />
	//...
</beans>

2.xml中引入AutowiredAnnotationBeanPostProcessor
<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-2.5.xsd">

<bean 
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
	
	<bean id="CustomerBean" class="com.yiibai.common.Customer">
		<property name="action" value="buy" />
		<property name="type" value="1" />
	</bean>

	<bean id="PersonBean" class="com.yiibai.common.Person">
		<property name="name" value="yiibai" />
		<property name="address" value="address ABC" />
		<property name="age" value="29" />
	</bean>
	
</beans>

@Qualifier注解,当Autowired注入时有多个相同类型的bean,通过该注解可以指定要注入哪个bean
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd">

	<context:annotation-config />

	<bean id="CustomerBean" class="com.yiibai.common.Customer">
		<property name="action" value="buy" />
		<property name="type" value="1" />
	</bean>

	<bean id="PersonBean1" class="com.yiibai.common.Person">
		<property name="name" value="yiibai-1" />
		<property name="address" value="address-1" />
		<property name="age" value="29" />
	</bean>
	
	<bean id="PersonBean2" class="com.yiibai.common.Person">
		<property name="name" value="yiibai-2" />
		<property name="address" value="address-2" />
		<property name="age" value="28" />
	</bean>
	
</beans>
public class Customer 
{
	@Autowired
	@Qualifier("PersonBean1")
	private Person person;
	private int type;
	private String action;
	//getter and setter methods
} 

猜你喜欢

转载自www.cnblogs.com/byebyebird/p/10132545.html