Spring学习笔记_01

1.Spring是什么

简单来说,spring是一个IOC(DI)和AOP容器框架

  • IOC(Inversion of Control):即控制反转,反转资源获取的方向,容器主动地将资源推送给它所管理的组件。
  • DI(Dependency Injection):即依赖注入,IOC的另一种表述方式,组件以一些预先定义好的方式接受来自如容器的注入。

2.在Spring的IOC容器里配置Bean(这里先讲基于xml文件的方式)

  • Bean的配置方式
    1. 通过全类名(反射),所以要求Bean 中必须有无参构造器
    2. 通过工厂方法(静态工厂方法 & 实例工厂方法)
    3. FactoryBean
  • 在xml文件中通过节点来配置bean
<!--通过全类名的方式来配置bean-->
<bean id="example" class="com.itzzz.spring.example">
</bean>
  • id: Bean的名称
    1. 在IOC容器中唯一;
    2. 若id没有指定,spring自动将全限定性类名作为Bean的名字;
    3. id可以指定多个名字,名字之间可用逗号、分号、或空格分隔。

Spring容器

在spring IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化。

  • Spring提供了两种类型的IOC容器实现
    1. BeanFactory:IOC容器的基本实现(很少使用);
    2. ApplicationContext:提供了更多的高级特性,是BeanFactory的子接口。
  • ApplicationContext的主要实现类
    1. ClassPathXmlApplicationContext:从类路径下加载配置文件
    2. FileSystemXmlApplicationContext:从文件系统中加载配置文件
  • ConfigurationApplicationContext扩展于ApplicationContext,新增两个主要方法:refresh()close(),让ApplicationContext具有启动、刷新和关闭上下文的的能力
  • ApplicationContext在初始化上下文时就能实例化所有单例的Bean.
  • WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作

从IOC容器种获取Bean

  • 调用 ApplicationContext 的 getBean() 方法
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) ctx.getBean("user");
  • bean之间的关系
    依赖:可以用ref 属性值指定当前属性指向哪一个 bean
    继承:使用parent属性实现
  • 自动装配:只声明 bean, 而把 bean 之间的关系交给 IOC 容器来完成,
    1. byType: 根据类型进行自动装配. 但要求 IOC 容器中只有一个类型对应的 bean, 若有多个则无法完成自动装配.
    2. byName: 若属性名和某一个 bean 的 id 名一致, 即可完成自动装配. 若没有 id 一致的, 则无法完成自动装配

在使用 XML 配置时, 自动转配用的不多. 但在基于 注解 的配置时, 自动装配使用的较多。
使用 list 元素来装配集合属性

<!--users为Bean的集合类型-->
<property name="users">
	<list>
		<ref bean="user1"/>
		<ref bean="user2"/>
	</list>
</property>
  • SpEL:
    SpEL: #{ },类似EL表达式,EL表达式: ${ }

SpEL的使用:

1.通过bean的id对bean进行引用

2.调用方法以及引用对象中的属性

3.计算表达式的值

4.正则表达式的匹配

引用的方法:

1.reference

2.SpEL

具体使用

1.使用spel引用类的静态属性: value="#{T(java.lang.Math).PI*80}"

2.使用spel来应用其他的bean: value="#{user}"

3.使用spel来应用其他的bean的属性: value="#{user.username}"

4.在spel中使用运算符: value="#{car.price>30? 1: 0}"

  • 内部Bean
    类似于匿名内部类对象. 不能被外部的 bean 来引用, 也没有必要设置 id 属性
<bean id="user" class="com.itzzz.spring.User">
	<property name="zzz" ref="user2"></property>
</bean>
  • 导入外部的资源文件:需要用context:property-placeholder标签,在location属性中指明路径

依赖注入的方式

  1. 属性注入
    属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象,属性注入使用 property元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 子节点指定属性值
    属性注入是实际应用中最常用的注入方式
<bean id="user" class="com.itzzz.spring.User">
	<property name="username" value="zzz"></property>
</bean>

这里的name属性值对应setter方法名

  1. 构造器注入
    通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。构造器注入在 constructor-arg 元素里声明属性, constructor-arg 中没有 name 属性
<bean id="user" class="com.itzzz.spring.User">
	<!--按索引匹配,以区分重载构造器-->
	<constructor-arg value="zzz" index=0></constructor>
	<!--或按类型匹配-->
	<constructor-arg value="zzz" typt="java.lang.String"/>
</bean>

若字面值中包含特殊字符, 则可以使用 CDATA 来进行赋值

<constructor-arg value="<![CDATA[<ATARZA>]]"></constructor-arg>

若想为属性赋null值,可以使用专门的标签

<bean id="user" class="com.atguigu.spring.User">
	<property name="username"><null/></property>
</bean>
  1. 工厂方法注入(很少使用,不推荐)
发布了7 篇原创文章 · 获赞 0 · 访问量 115

猜你喜欢

转载自blog.csdn.net/weixin_44415250/article/details/104443885
今日推荐