Java丨Spring:一、框架概述与IOC容器(上)

1、Spring框架概述

  • Spring是轻量级的开源的JavaEE框架
  • Spring可以解决企业应用开发的复杂性
  • Spring有两个核心部分:IOCAop
    • IOC:控制反转,把创建对象过程交给Spring进行管理
    • Aop:面向切面,不修改源代码进行功能增强
  • Spring特点
    • 方便解耦,简化开发
    • Aop编程支持
    • 方便程序测试
    • 方便和其他框架进行整合
    • 方便进行事务操作
    • 降低API开发难度

2、IOC容器(控制反转)

2.1、什么是IOC

  • 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理
  • 使用IOC目的:为了耦合度降低

2.2、IOC底层原理

  • xml解析、工厂模式、反射
    在这里插入图片描述

2.3、IOC容器实现两种方式(两个接口)

  • BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用
    • 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
    • IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
  • ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用
    • 加载配置文件时候就会把在配置文件对象进行创建

3、Bean管理的概念

3.1、什么是Bean管理

  • Bean管理指的是两个操作
    • Spring创建对象
    • Spirng注入属性

3.2、Bean管理操作有两种方式

  • 基于xml配置文件方式实现
  • 基于注解方式实现

4、基于 xml 方式注入

4.1、基于xml方式创建对象

  • 在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
  • 在bean标签有很多属性,介绍常用的属性
    • id属性:唯一标识
    • class属性:类全路径(包类路径)
  • 创建对象时候,默认也是执行无参数构造方法完成对象创建

4.2、基于xml方式注入属性

  • DI:依赖注入,就是注入属性

4.3、第一种注入方式:使用set方法进行注入

  • 创建类,定义属性和对应的set方法
/**
* 演示使用set方法进行注入属性
*/ 
public class Book { 
    //创建属性 
    private String bname; 
    private String bauthor; 
    //创建属性对应的set方法 
    public void setBname(String bname) { 
        this.bname = bname; 
    } 
    public void setBauthor(String bauthor) { 
        this.bauthor = bauthor; 
    } 
}
  • 在spring配置文件配置对象创建,配置属性注入
<!--2 set方法注入属性--> 
<bean id="book" class="com.atguigu.spring5.Book"> 
    <!--使用property完成属性注入 name:类里面属性名称 value:向属性注入的值 --> 
    <property name="bname" value="易筋经"></property> 
    <property name="bauthor" value="达摩老祖"></property> 
</bean>

4.4、第二种注入方式:使用有参数构造进行注入

  • 创建类,定义属性,创建属性对应有参数构造方法
/**
* 使用有参数构造注入
*/ 
public class Orders { 
    //属性 
    private String oname; 
    private String address; 
    //有参数构造 
    public Orders(String oname,String address) { 
        this.oname = oname; 
        this.address = address; 
    } 
}
  • 在spring配置文件中进行配置
<!--3 有参数构造注入属性--> 
<bean id="orders" class="com.atguigu.spring5.Orders"> 
    <constructor-arg name="oname" value="电脑"></constructor-arg> 
    <constructor-arg name="address" value="China"></constructor-arg> 
</bean>

4.5、p名称空间注入(了解)

  • 使用p名称空间注入,可以简化基于xml配置方式
  • 添加p名称空间在配置文件中
<!--1、添加p名称空间在配置文件头部-->
<?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:p="http://www.springframework.org/schema/p"		<!--在这里添加一行p-->
  • 进行属性注入,在bean标签里面进行操作
<!--2、在bean标签进行属性注入(算是set方式注入的简化操作)-->
    <bean id="book" class="com.atguigu.spring5.Book" p:bname="九阳神功" p:bauthor="无名氏"></bean>

5、xml注入其他类型属性

5.1、字面量

  • null值
<!--null值--> 
<property name="address"> 
    <null/> 
</property>
  • 属性值包含特殊符号
<!--属性值包含特殊符号 
1 把<>进行转义 &lt; &gt; 
2 把带特殊符号内容写到CDATA 
--> 
<property name="address"> 
    <value><![CDATA[<<南京>>]]></value> 
</property>

5.2、注入属性 - 外部bean

  1. 创建两个类 service类和dao类
  2. 在service调用dao里面的方法
  3. 在spring配置文件中进行配置
public class UserService {
	//创建 UserDao 类型属性,生成 set 方法 
	private UserDao userDao; 
	public void setUserDao(UserDao userDao) { 
        this.userDao = userDao; 
    } 
    public void add() { 
        System.out.println("service add...............");
        userDao.update(); 
    } 
}
<!--1 service 和 dao 对象创建--> 
<bean id="userService" class="com.atguigu.spring5.service.UserService"> 
    <!--注入 userDao 对象 
        name 属性:类里面属性名称 
        ref 属性:创建 userDao 对象 bean 标签 id 值 
    --> 
    <property name="userDao" ref="userDaoImpl"></property> 
</bean> 
<bean id="userDaoImpl" class="com.atguigu.spring5.dao.UserDaoImpl"></bean>

5.3、注入属性 - 内部bean

  • 一对多关系:部门和员工
    • 一个部门有多个员工,一个员工属于一个部门
    • 部门是一,员工是多
  • 在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示
//部门类 
public class Dept { 
    private String dname; 
    public void setDname(String dname) { 
        this.dname = dname; 
    } 
} 
//员工类 
public class Emp { 
    private String ename; 
    private String gender; 
    //员工属于某一个部门,使用对象形式表示 
    private Dept dept; 
    public void setDept(Dept dept) { 
        this.dept = dept; 
    } 
    public void setEname(String ename) { 
        this.ename = ename; 
    } 
    public void setGender(String gender) { 
		this.gender = gender;
	}
}
  • 在spring配置文件中进行配置
<!--内部 bean--> <bean id="emp" class="com.atguigu.spring5.bean.Emp">     <!--设置两个普通属性-->     <property name="ename" value="lucy"></property>     <property name="gender" value=""></property>     <!--设置对象类型属性-->     <property name="dept">         <bean id="dept" class="com.atguigu.spring5.bean.Dept">            <property name="dname" value="安保部"></property>         </bean>     </property> </bean>

5.4、注入属性 - 级联赋值

  • 第一种写法
<bean id="emp" class="com.atguigu.spring5.bean.Emp">     <!--设置两个普通属性-->     <property name="ename" value="lucy"></property>       <property name="gender" value=""></property>        <!--级联赋值-->     <property name="dept" ref="dept"></property> </bean> <bean id="dept" class="com.atguigu.spring5.bean.Dept">    <property name="dname" value="财务部"></property> </bean>
  • 第二种写法
//方式二:生成dept的get方法(get方法必须有!!)
public Dept getDept() {
    return dept;
}
<!--级联赋值--> 
<bean id="emp" class="com.atguigu.spring5.bean.Emp">
    <!--设置两个普通属性--> 
    <property name="ename" value="lucy"></property>
    <property name="gender" value=""></property>
    <!--级联赋值--> 
    <property name="dept" ref="dept"></property> 
    <property name="dept.dname" value="技术部"></property>
</bean> 
<bean id="dept" class="com.atguigu.spring5.bean.Dept"> 
    <property name="dname" value="财务部"></property> 
</bean>

6、xml注入集合属性

6.1、注入数组、List集合、Map集合类型属性

  • 创建类,定义数组、list、map、set类型属性,生成对应set方法
public class Stu {
    //1 数组类型属性 
    private String[] courses; 
    //2 list 集合类型属性 
    private List<String> list; 
    //3 map 集合类型属性 
    private Map<String,String> maps;
    //4 set 集合类型属性 
    private Set<String> sets; 
	public void setSets(Set<String> sets) { 
    	this.sets = sets; 
	}
    public void setCourses(String[] courses) { 
    	this.courses = courses; 
	} 
	public void setList(List<String> list) { 
    	this.list = list; 
	} 
    public void setMaps(Map<String, String> maps) {
        this.maps = maps; 
    } 
}
  • 在spring配置文件进行配置
<!--1 集合类型属性注入--> 
<bean id="stu" class="com.atguigu.spring5.collectiontype.Stu">
    <!--数组类型属性注入--> 
    <property name="courses"> 
        <array> 
            <value>java 课程</value> 
            <value>数据库课程</value> 
        </array> 
    </property> 
    <!--list 类型属性注入--> 
    <property name="list"> 
        <list>
            <value>张三</value>
            <value>小三</value> 
        </list> 
    </property> 
    <!--map 类型属性注入--> 
    <property name="maps"> 
        <map> 
            <entry key="JAVA" value="java"></entry>
            <entry key="PHP" value="php"></entry> 
        </map> 
    </property> 
    <!--set 类型属性注入--> 
     <property name="sets"> 
        <set> 
            <value>MySQL</value> 
            <value>Redis</value> 
        </set> 
    </property> 
</bean>

6.2、在集合里面设置对象类型值

<!--创建多个 course 对象--> 
<bean id="course1" class="com.atguigu.spring5.collectiontype.Course">
    <property name="cname" value="Spring5 框架"></property> 
</bean> 
<bean id="course2" class="com.atguigu.spring5.collectiontype.Course">
    <property name="cname" value="MyBatis 框架"></property> 
</bean> 
<!--注入 list 集合类型,值是对象--> 
<property name="courseList"> 
    <list> 
        <ref bean="course1"></ref> 
        <ref bean="course2"></ref> 
    </list> 
</property>

6.3、把集合注入部分提取出来

  • 在spring配置文件中引入名称空间 util
<?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:p="http://www.springframework.org/schema/p" 
       xmlns:util="http://www.springframework.org/schema/util" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd 
                           http://www.springframework.org/schema/util 
http://www.springframework.org/schema/util/spring-util.xsd">
  • 使用util标签完成list集合注入提取
<!--1 提取list集合类型属性注入--> 
<util:list id="bookList">
	<value>易筋经</value>
    <value>九阴真经</value> 
    <value>九阳神功</value> 
</util:list> 
<!--2 提取 list 集合类型属性注入使用--> 
<bean id="book" class="com.atguigu.spring5.collectiontype.Book">
    <property name="list" ref="bookList"></property> 
</bean>

7、工厂bean(FactoryBean)

  • Spring有两种类型bean,一种普通bean,另外一种工厂bean(FactoryBean)
    • 普通bean:在配置文件中定义bean类型就是返回类型
    • 工厂bean:在配置文件定义bean类型可以和返回类型不一样
  • 第一步 创建类,让这个类作为工厂bean,实现接口 FactoryBean
  • 第二步 实现接口里面的方法,在实现的方法中定义返回的bean类型
public class MyBean implements FactoryBean<Course> {
    //定义返回 bean 
    @Override 
    public Course getObject() throws Exception {
        Course course = new Course(); 
        course.setCname("abc"); 
        return course; 
    } 
    @Override 
    public Class<?> getObjectType() { 
        return null; 
    }                                            
    @Override 
    public boolean isSingleton() { 
        return false; 
    }
}
<bean id="myBean" class="com.atguigu.spring5.factorybean.MyBean">
</bean>
@Test 
public void test3() { 
    ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
    Course course = context.getBean("myBean", Course.class); 
    System.out.println(course); 
}

8、bean作用域

  • 在Spring里面,默认情况下,bean是单实例对象

8.1、如何设置单实例还是多实例

  • 在spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例
  • scope属性值
    • singleton(默认),表示是单实例对象
    • prototype,表示是多实例对象

8.2、singleton和prototype区别

  • singleton单实例,prototype多实例
  • 设置scope值是singleton时候,加载spring配置文件时候就会创建单实例对象
  • 设置scope值是prototype时候,不是在加载spring配置文件时候创建 对象,在调用getBean方法时候创建多实例对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值