Spring ioc学习笔记

什么是框架?
具有约束性的去支撑我们实现各种功能的半成品的项目

MVC:客户端发送请求,由控制层进行处理,由模型层装载并传输数据,并且在视图层进行展示
applicationContext.xml//Spring配置文件默认的名字,名字可以变 初始化容器的时候需要写配置文件路径,把名字写进去就行
xml中头部的地址是命名空间

在实体类中使用setXx方法注入赋值

<bean id="person唯一标识" class="此对象所属类的全类名(指定对象属于哪个类)">
	<property name="id" value="1111"></property>
	<property name="name" value="小明"></property>
</bean>

在实体类中使用有参构造器方法注入赋值
通过索引值指定参数位置index
通过类型区分重载的构造器type

<bean id="person唯一标识" class="此对象所属类的全类名(指定对象属于哪个类)">
	<constructor-arg value="1111"></constructor-arg>
	<constructor-arg value="小明" index ="1" type="java.lang.String" ></constructor-arg>
</bean>

p名称空间注入赋值


<bean id="person唯一标识" class="此对象所属类的全类名(指定对象属于哪个类)" 
p:studentId="2002" p:stuName="Jerry2016" p:age="18" >
</bean>

引用数据类型用ref赋值

定义在某个bean内部的bean只能在当前bean中使用

List注入赋值
配置java.util.List类型的属性,需要指定标签,在标签里包含一些元素。
这些标签可以通过指定简单的常量值,通过指定对其他Bean的引用。
通过指定内置bean定义。通过指定空元素。甚至可以内嵌其他集合。
数组的定义和List一样,都使用元素。
配置java.util.Set需要使用标签,定义的方法与List一样。

<bean id="shop" class="com.atguigu.spring.bean.Shop" >
           <property name= "categoryList">
               <!-- 以字面量为值的List集合 -->
               <list>
                    <value> 历史</value >
                    <value> 军事</value >
               </list>
           </property>
           <property name= "bookList">
               <!-- 以bean的引用为值的List集合 -->
               <list>
                    <ref bean= "book01"/>
                    <ref bean= "book02"/>
               </list>
           </property>
     </bean >

<bean>spring所管理的对象
id:该对象的唯一标识,注意不能重复 在通过类型获取bean的过程中可以不设置
<property>为对象的某个属性进行赋值
name:属性名
value:属性值

如何获得spring容器所管理的对象?
1.初始化容器
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
2.获得容器对象,通过getBean方法
ac.getBean("id唯一标识")
Person person=(Person)ac.getBean("person//这是id")
//通过类型获取对象,使用此方法获取对象时,要求spring所管理的此类型对象只能有一个
Person person=(Person)ac.getBean(Person.class)

无参构造创建对象,bean为单例 在spring初始化容器时就创建对象;而多例会在使用时创建

Spring IOC容器对bean的生命周期进行管理的过程:
① 通过构造器或工厂方法创建bean实例//构造器
② 为bean的属性设置值和对其他bean的引用//set注入
③ 调用bean的初始化方法//init
④ bean可以使用了//toString
⑤ 当容器关闭时,调用bean的销毁方法//destory
在配置bean时,通过init-method和destroy-method 属性为bean指定初始化和销毁方法
初始化和销毁的方法在实体类中创建

spring加载外部文件,两种方式

1.<!-- 加载资源文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="db.properties"></property></bean>
2.引入context名称空间,spring配置文件专门提供的加载配置文件的标签
<context:property-placeholder location="db.properties"/>

自动装配(注入 赋值)
spring所管理的一个bean就是一个对象
了解:
autowire:根据我们所设置的某种策略为非字面量的属性自动赋值(字面量简单理解就是可以用value直接赋值的 非字面量用ref赋值)
当使用autowire属性,会作用于该bean中所有的非字面量属性,所以两种方法都不用
1)根据名称自动装配:通过属性名和spring容器中的bean的id进行比较,若一致则直接赋值
<bean id="emp" class="com.atguigu.ioc.auto.Emp" autowire="byName">
2)根据类型自动装配:将类型匹配的bean作为属性注入到另一个bean中。
若IOC容器中有多个与目标bean类型一致的bean,Spring将无法判定哪个bean最合适该属性,
所以不能执行自动装配
在配置文件中所管理的对象不一定只能为其本身类型赋值,还可以为他的父类以及他所实现的接口类赋值
<bean id="emp" class="com.atguigu.ioc.auto.Emp" autowire="byType">

使用注解标识组件(bean)
1)普通组件:@Component//组件
标识一个受Spring IOC容器管理的组件 加到类上
2)持久化层组件:@Repository
标识一个受Spring IOC容器管理的持久化层组件
3)业务逻辑层组件:@Service
标识一个受Spring IOC容器管理的业务逻辑层组件
4)表述层控制器组件:@Controller
标识一个受Spring IOC容器管理的表述层控制器组件
以上四个注解功能完全相同
@Respository、@Service、@Controller这几个注解仅仅是为了让开发人员自己明确当前的组件扮演的角色。

扫描组件
组件被上述注解标识后还需要通过Spring进行扫描才能够侦测到。
1)指定被扫描的package 会将加上注解的类作为spring的组件进行加载
组件:spring中所管理的bean
作为spring的组件进行加载:会自动在spring的配置文件中生成相对应的bean,这些bean的id是类名变为首字母小写
<context:component-scan base-package="com.atguigu.component"/>
加注解与扫描标签同时存在
包含与排除
<context:include-filter>子节点表示要包含的目标类
注意:通常需要与use-default-filters属性配合使用才能够达到“仅包含某些组件”这样的效果。
即:通过将use-default-filters属性设置为false,禁用默认过滤器,然后扫描的就只是include-filter中的规则指定的组件了。
<context:exclude-filter>子节点表示要排除在外的目标类

<context:component-scan base-package="com.atguigu.ioc.userMod" use-default-filters="true">
		<!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> -->
		<!-- <context:include-filter type="assignable" expression="com.atguigu.ioc.userMod.service.UserServiceImpl"/> -->
		<!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> -->
		<!-- <context:exclude-filter type="assignable" expression="com.atguigu.ioc.userMod.dao.UserDaoImpl"/> -->
	</context:component-scan>

2)JAR包
必须在原有JAR包组合的基础上再导入一个:spring-aop-4.0.0.RELEASE.jar

总结:
完成组件化的过程:
1.在需要被spring管理的类上加上相应的注解
2.在配置文件中通过<context:component-scan>对所设置的包结构进行扫描,会将加上注解的类作为spring的组件进行加载
组件:spring中所管理的bean
作为spring的组件进行加载:会自动在spring的配置文件中生成相对应的bean,这些bean的id是类名变为首字母小写
也可以通过这四个注解 比如:@Controller(“beanId”)为自动生成的bean指定id
自动装配:在需要赋值的非字面量上,加上@Autowired,就可以在spring容器中通过不同的方式匹配相对应的bean
@Autowired装配是默认使用byType方式,此时要求spring容器中只会有一个能够为其赋值,
当byType实现不了,会自动切换到byName,此时要求spring容器中有一个bean的id和属性名一致
若自动装配时,匹配到多个能够赋值的bean 可使用@Qualifier(value=“beanId”)指定使用的bean
@Autowired和@Qualifier可以一起作用于一个待形参的方法上 此时@Qualifier(value=“beanId”)所指定的bean作用于形参

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值