0
点赞
收藏
分享

微信扫一扫

Spring核心知识-Ioc简述(概念和使用)

yellowone 2022-02-20 阅读 89

spring核心两大核心内容为ioc和aop。
本章节讲ioc的概念、作用和使用方式。

ioc简单介绍:

概念:控制反转,把对象创建和对象之间的调用过程,交给Spring管理
目的是降低耦合
底层原理:xml解析、工厂模式、反射
.过程:

  • 1 xml解析得到类的全路径
 ApplicationContext applicationContext =new
                ClassPathXmlApplicationContext("bean.xml");
  • 2 通过反射创建对象
  • 3 通过工厂类返回
   User user  =applicationContext.getBean("user",User .class);

Ioc思想基于ioc容器完成,ioc容器本质上就是对象工厂
spring提供ioc容器实现两种方式:(两个接口)
1.BeanFactory
Ioc容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用
ps:加载配置文件的时候不会创建对象,在获取对象使用才会去创建对象

2.ApplicationContext
有两个实现类:不同在于FileSystemXmlApplicationContext是传绝对路径,ClassPathXmlApplicationContext是传在项目中的相对路径。

ApplicationContext applicationContext =new
                ClassPathXmlApplicationContext("bean.xml");
        User user  =applicationContext.getBean("user",User .class);

ioc管理对象:(指的是创建对象和注入属性
1.基于xml配置文件
2.基于注解方式

基于xml方式:

1.基于xml方式创建对象

使用bean标签 id:唯一属性 class:类全路径

 <bean id="user" class="com.wsl.spring.dao.UserDao" ></bean>

2.基于xml方式注入属性

DI:依赖注入,是ioc注入属性的具体实现

2.1.基于set注入 :使用property注解

 <bean id="user" class="com.wsl.spring.pojo.User" >
        <property name="name" value="小红"></property>
        <property name="age" value="11"></property>
    </bean>

2.2.基于有参构造器注入

<bean id="user" class="com.wsl.spring.pojo.User" >
        <constructor-arg index="0" value="小绿"></constructor-arg>
        <constructor-arg index="1" value="22"></constructor-arg>
    </bean>

如果set注入和构造器注入都写了,先执行构造器,再执行set

2.3.p命名空间注入

可以简化基于xml方式注入
1.在配置文件中添加p命名空间

 <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        **xmlns:p="http://www.springframework.org/schema/p"** 
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

2.使用p注入

 <bean id="user" class="com.wsl.spring.pojo.User"
    p:age="33" p:name="小兰">
    </bean>

ps:特殊符号处理
1.转义
2.CDATA格式

bean

在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象
spring中有两种bean,一种是普通bean,一种是工厂bean FactoryBean (不是beanEactory 不一样的)
普通bean:在配置文件中定义bean类型就是返回类型
工厂bean:在配置文件中定义bean类型可以和返回类型不一样
Step1:创建类,让这个类作为工厂bean,实现接口FactoryBean
Step2:实现接口的方法,在实现的方法中定义返回的类型。

bean的作用域

spring中默认是单实例的,在加载spring配置文件的时候就会创建单实例对象。
设置为prototype的时候,在调用getBean的时候才会创建多实例对象。
在这里插入图片描述

bean的生命周期:

bean对象从创建到销毁的过程。
1.通过构造器创建bean实例
2.为bean的属性设置值和对其他bean的引用(调用set)
3.调用bean的初始化(需要配置初始化方法)init-method配置
4.使用bean
5.当容器关闭,调用bean的销毁方法(需要配置销毁的方法)destroy-method配置

 <bean id="user" class="com.wsl.spring.pojo.User"
    p:age="33" p:name="小兰" init-method="init" destroy-method="destory">
    </bean>

外部文件配置bean

1.创建文件jdbc.properties

#============================#
#===== Database sttings =====#
#============================#

#oracle database settings
#jdbc.type=oracle
#jdbc.driver=oracle.jdbc.driver.OracleDriver
#jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
#jdbc.username=jeesite
#jdbc.password=123456

2.引入文件并注入bean

<!-- 加载配置属性文件 -->
	<context:property-placeholder ignore-unresolvable="true" location="classpath:jdbc.properties" />
<!-- bean设置 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
		<!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
		<property name="driverClassName" value="${jdbc.driver}" />

		<!-- 基本属性 url、user、password -->
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />

		<!-- 配置初始化大小、最小、最大 -->
		<property name="initialSize" value="${jdbc.pool.init}" />
		<property name="minIdle" value="${jdbc.pool.minIdle}" />
		<property name="maxActive" value="${jdbc.pool.maxActive}" />

		<!-- 配置获取连接等待超时的时间 -->
		<property name="maxWait" value="60000" />
	</bean>

基于注解方式:

1.开启组件扫描

component-scan 指定注解扫描包
<context:component-scan base-package="com.wsl"></context:component-scan>

或者直接使用@ComponentScan注解

2.在需要扫描的类上面加注解

@Component

@Component("user")
// 相当于配置文件中 <bean id="user" class="当前注解的类"/>

@Component三个衍生注解
为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。
@Controller:controller层
@Service:service层
@Repository:dao层

3.基于注解实现属性注入

1.@Autowired

在使用@Autowired时,首先在容器中查询对应类型的bean
    如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
    如果查询的结果不止一个,那么@Autowired会根据名称来查找。
    如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false

2.@Qualifier

@Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配
@Qualifier不能单独使用。

3.@Resource

**@Autowired@Resource异同:
1@Autowired@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。
2@Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,
如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) 
,如果我们想使用名称装配可以结合@Qualifier注解进行使用
3@Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。
如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在
setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。
但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。**

其他注解:

@Value 注入属性

 @Value("小红")
   // 相当于配置文件中 <property name="name" value="小红"/>

自动装配是使用spring满足bean依赖的一种方法
spring会在应用上下文中为某个bean寻找其依赖的bean。
Spring中bean有三种装配机制,分别是:

在xml中显式配置;
在java中显式配置;
隐式的bean发现机制和自动装配。

自动装配:根据指定装配规则(属性名称或者属性类型),将匹配的属性值进行注入。

Spring的自动装配需要从两个角度来实现,或者说是两个操作:
组件扫描(component scanning):spring会自动发现应用上下文中所创建的bean;
自动装配(autowiring):spring自动满足bean之间的依赖,也就是我们说的IoC/DI;
组件扫描和自动装配组合发挥巨大威力,使得显示的配置降低到最少。

举报

相关推荐

0 条评论