Spring学习笔记----IOC

一、IOC

把创建对象的权力交给框架,降低模块之间的耦合性。使得单个模块在编写时不依赖于其他模块(能通过编译检测,完全解耦不可能)。包括依赖注入和依赖查找。
Spring中通过核心容器实现IOC,容器为map的数据结构,key为我们在配置Spring时所设动的类的标识符,value为具体类的全限定类名。在运行时,Spring通过BeanFactory读取容器中的类并创建对象。可以通过xml和注解配置核心容器。
同时在核心容器之中的类之间存在着依赖关系时(不可避免),可以通过依赖注入的方式创建具体对象。

二、基于xml配置文件

一、环境搭建

1

基于maven工程,需要引入Spring及一些必要组件的依赖坐标:

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
</dependency>

2

同时需要在工程的根目录下创建Spring的具体配置文件,具体约束如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
<\beans>

二、配置Spring的xml配置文件

1、无依赖注入

让Spring管理资源,把具体类存入Spring核心容器之中,这里用到了bean标签
有id属性,class属性,scope属性,init-method属性,destroy-method属性,factory-bean属性,factory-method属性

id属性为具体类的唯一标识符;
class属性为要创建对象的全限定类名;
scope属性指定对象的作用范围:有singleton(默认的,单例创建),prototype(多例创建),request,session,global session属性;
init-method:指定类中的初始化方法名称;
destroy-method:指定类中的销毁方法名称;
factory-bean:使用实例工厂方法时的实例工厂的bean;
factory-bean:使用工厂方法时用于创建对象的方法名称。

默认情况下,没有使用工厂创建时,Spring调用具体类的无参构造函数创建对象,但也可以编写工厂类,具体可以是静态的和非静态的。

<bean id="id" class="xx.xx.xx"></bean>

静态工厂方法需要用class属性指定静态工厂的全限定类名,factory-method属性指定创建对象的静态方法。

<bean id="xx"
		class="xxx.xxx.xx"
		factory-method="methodname"></bean>

非静态工厂和普通类一样,首先需要配置bean标签,然后再具体类的bean标签中使用factory-bean属性指定工厂bean的唯一标识符,factory-method属性指定创建对象的方法。

<bean id="xx"
		factory-bean="factoryid"
		factory-method="methodname"></bean>

2、依赖注入

由于通常情况下,再编写具体类时没有对成员变量赋初值,在一些成员方法使用时会出现问题,同时成员变量有可能是其他的bean对象,这时就需要依赖注入了。一般可以通过构造函数注入,以及set方法注入。

①构造函数注入

在bean标签内加入constructor-arg标签,一个constructor-arg标签代表了构造函数的一个参数,其中可以
使用index,type,name指定具体参数(推荐使用name),
使用value属性对基本数据类型和String类型赋值,
ref属性为其他bean对象赋值(唯一标识符)

<bean id="id" class="xxx.xx.xx">
	<constructor-arg name="xx" value="xx"> </constructor-arg>
	...
</bean>
②set方法注入

在具体类中提供需要注入成员的set方法,然后再配置文件的具体bean标签内部加入property标签,一个property标签代表一个成员变量,以
name属性指定参数名;
value指定基本数据类型及String;
ref指定其他bean对象。
注入集合数据时,再property标签内部使用set,array,list标签(内部通过value标签赋值)注入List结构的集合;使用map(内部使用entry标签赋值),props(使用key属性赋值)标签注入map结构的集合。

<bean id="id" class="xxx.xx.xx">
	<property name="name" value(ref)=""> </property>
	<property name="name"> 
		<set/list/array>
			<value>aaa</value>
			...
		</set/list/array>
	</property>
	<property name="name"> 
		<map>
			<entry key="key" value="value"></entry>
			...
		</map>
	</property>
	<property name="name"> 
		<props>
			<prop key="key" >value</prop>
			...
		</props>
	</property>
</bean>

三、基于注解使用Spring

观察基于xml的配置,在bean标签之中,至少有name,class等属性,那么在注解中对应的也应该让Spring框架知道这些值。

一、简单bean

对应着在xml配置文件中的bean标签,可以在类前使用@Component注解,该注解有一个
value属性:用于指定bean的id,默认为当前类的类名,首字母小写。
同时为了更加贴近三层架构,有着
@Controller注解:用于表现层
@Service注解:用于业务层
@Repository:用于持久层
该三个注解的作用与属性与@Component一样。

二、依赖注入

依赖注入对应xml文件配置中的property标签(使用set方法注入),这里有
@Autowired:自动按照类型注入,它只能注入其他bean类型,当有多个类型匹配时,使用要注入的对象变量名作为bean的id,在Spring核心容器中查找,否则会报错。
@Qualifier:在Autowired注入的基础上,再按照bean的id注入(通过value属性)。在给成员变量注入时不能独立使用,但在给方法参数注入时,可以独立使用。
@Resource:直接按照bean的id注入(通过name属性)。
@value:注入基本数据类型与String类型。

三、生命周期的注解

@Scope:指定bean的作用范围,与bean的scope属性一样,取值也一样
@PostConstruct:指定初始化方法
@PreDestory:指定销毁方法

四、设置Spring配置类

使用配置类可以完全不使用xml文件
@Configuration:用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解
@ComponentScan:用于指定Spring在初始化容器时要扫描的包,将该包中的注解加载(使用value属性指定要扫描的包名)
@Bean:该注解只能写在方法上,表明使用此方法创建一个对象,并放入Spring容器,value属性设动唯一标识符
@PropertySource:用于加载.properties文件中的配置,使用value属性指定properties文件位置。如果在类路径下,需要加上classpath:
@Import:用于导入其他配置类,value属性为其他配置类的字节码

四、通过Spring创建对象

完成Spring的配置后就可以通过Spring创建对象了。在创建对象之前,首先得获取Spring的容器,Spring容器有很多接口,顶层接口为BeanFactory,还有一个常见的ApplicationContext接口。
BeanFactory创建为惰性的,什么时候使用什么时候创建对象;
ApplicationContext只要一读取配置就会创建对象
通常使用ApplicationContext的接口实现类
ClassPathXmlApplicationContext:从类的根目录加载配置文件
FileSystemXmlApplicationContext:从文件系统加载配置文件
AnnotationConfigApplicationContext:使用注解
根据不同的配置方式选择不同的实现类,之后调用该类的getBean方法(参数为要创建类的唯一标识符)即可返回具体类的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值