Spring5框架基础详解(一) Spring概念和IOC容器Bean管理XML方式(注入属性:外部Bean,内部Bean,两种级联赋值)

文章目录

  • 前言
  • 一、Spring概念
  • 二、IOC容器
    • 什么是IOC
    • IOC底层原理:xml解析,工厂模式,反射。
    • IOC接口
    • IOC容器-Bean管理XML方式
    • 1.注入属性-外部bean
    • 2.注入属性-内部bean
    • 3.1注入属性-级联赋值(第一种写法)
    • 3.2级联赋值第二种写法
  • 总结


前言

Spring是一个开源框架。它是为了解决企业应用开发的复杂性而创建的。Spring的用途不仅限于服务器端的开发。
从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。


一、Spring概念

		1.Spring是轻量级的开源的JavaEE框架。
		2.Spring两个核心部分:IOC和Aop
				*1.IOC:控制反转,把创建对象的过程交给spring进行管理。
				*2.Aop:面向切面编程,不修改源代码的情况下进行功能加强。
		3.特点:
				*1.方便解耦,简化开发。
				*2.Aop编程支持。
				*3.方便程序测试
				*4.方便和其他框架整合。
				*5.方便事务操作。	

二、IOC容器

什么是IOC

	IOC底层原理,
	IOC接口(BeanFactory),
	IOC操作Bean管理(基于XML),
	IOC操作Bean管理(基于注解)
	
		*1.控制反转,把对象的创建和对象之间的调用过程,交给Spirng进行管理。
		*2.使用IOC的目的是为了耦合度降低。

IOC底层原理:xml解析,工厂模式,反射。

Spring5框架基础详解(一) Spring概念和IOC容器Bean管理XML方式(注入属性:外部Bean,内部Bean,两种级联赋值)_第1张图片

		IOC过程: 
		*1 xml配置文件,配置创建的对象:
		
		*2.有service类和dao类,创建工厂类:

代码如下(示例):

class  UserFactory{
	public static UserDao getDao(){
		String classValue =class属性值;	// 1.可以通过xml解析得到
		Class clazz=Class.forName(classValue )//2.通过反射创建对象
		return(UserDao)clazz.newInstance(); //3.创建对象
	}
}

IOC接口

1.IOC思想基于IOC容器完成,IOC容器底层就是对象工厂。
2.Spring提供IOC容器实现两种方式(加载配置文件,获取配置文件的对象):
		*1.BeanFactory:IOC容器基本实现方式,是Spring内部使用的接口。
		*2.ApplicationContext:BeanFactory的子接口,提供更多更强大的功能,一般由开发人员使用。

IOC容器-Bean管理XML方式

	1.什么是Bean管理:(Bean管理是指下边两个操作)
			*1.Spring创建对象
			*2.Spring注入属性
	2.Bean管理操作有两种方式:
				*1.基于xml方式创建对象:
					
							*在spring配置文件中,使用bean标签,标签里面添加对应的属性,就可以实现对象创建。
							*id属性:唯一标识
							*class属性:类全路径名
							*name属性:和id类似,可以使用特殊符号
					创建对象时候,默认也是执行无参数构造方法完成对象创建。						
				*2.基于xml方式注入属性:
						*DI:依赖注入,就是注入属性。
						
								***第一种注入方式***:使用set方法进行注入。					
	(步骤1).创建类,定义属性和对应的set方法
public class User{
	//创建属性
private String name;
private String bauthor;
	//创建属性对应的set方法
public void setBname(String bname){
this.bname =bname;
}
  (步骤2).在spring的配置文件中,配置对象创建,再配置属性注入 
    <!-- 配置us对象创建-->
    <bean id="us" class="cn.hncj.services.User">
        <property name="uname" value="李四"/>
    </bean>
							**第二种注入方式:**  有参构造注入。	
public class User {
    private int id;
    private String uname;

    public void setUname(String uname) {
        this.uname = uname;
    }
}
 <!--3. 有参数构造注入属性-->
    <bean id="student" class="cn.hncj.services.Student">
    <constructor-arg name="sid" value="13143"></constructor-arg>
    <constructor-arg name="sname" value="狗狗"></constructor-arg>
    </bean>
			*3.基于xml方式注入其他属性:
					*1.字面量
						(1)null值
   					 
   					 
   					 
						(2)属性值包含特殊符号
					
   				   
   				   >] ]>
   				   
   			    	 

1.注入属性-外部bean

	三层架构体系:web层调用services层,services层调用dao层,services层调用dao层的步骤称为引入web 
		引入外部bean步骤:
				*创建两个类sevice类和dao类
				*在service层调用dao里面的方法
				*在spring配置文件中进行配置
public interface TeacherDao {
    public void update();
}




public class TeacherDaoImpl implements TeacherDao{
    @Override
    public void update() {
        System.out.println("dao update....");
    }
}



public class TeacherService {
    //创建TeacherDao类型属性,生成set方法
    private TeacherDao teacherDao;
    public void setTeacherDao(TeacherDao teacherDao) {
        this.teacherDao = teacherDao;
    }
    //传统方式1.创建TeacherDao的对象,接口等于new它的实现类的对象,这个过程称为多态。
    //TeacherDao teacherDao = new TeacherDaoImpl();
    //teacherDao.update();
    public void add() {
        System.out.println("service add....");
        teacherDao.update();
    }
}

        
    <bean id="teacherService" class="cn.hncj.services.TeacherService">
        
        <property name="teacherDao" ref="teacherDaoImpl">property>
    bean>
    <bean id="teacherDaoImpl" class="cn.hncj.dao.TeacherDaoImpl">bean>

2.注入属性-内部bean

(1).一对多关系:部门和员工
		一个部门有多个员工,一个员工属于一个部门
(2).在实体类之间表示一对多关系:(如下代码)
public class Dept {
    //部门类
    private String dname;

    public void setDname(String dname) {
        this.dname = dname;
    }
    @Override
    public String toString() {
        return "Dept{" +
                "dname='" + dname + '\'' +
                '}';
    }
}




public class Emp {
    //员工类
    private String ename;
    private  String gender;
    //员工属于某一个部门,使用对象类型属性 表示
    private Dept dept;

    public void setDept(Dept dept) {
        this.dept = dept;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    public void add(){
        System.out.println(ename+gender+dept);
    }
}
(3.在spring配置文件中进行配置:
   
    <bean id="emp" class="cn.hncj.bean.Emp">
        
        <property name="ename" value="lucky">property>
        <property name="gender" value="">property>
        
        <property name="dept">
            <bean id="dept" class="cn.hncj.bean.Dept">
                <property name="dname" value="安保部">property>
            bean>
        property>
    bean>

控制台输出:
在这里插入图片描述

3.1注入属性-级联赋值(第一种写法)

public class Dept {
    //部门类
    private String dname;

    public void setDname(String dname) {
        this.dname = dname;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "dname='" + dname + '\'' +
                '}';
    }
}


public class Emp {
    //员工类
    private String ename;
    private String gender;
    //员工属于某一个部门,使用对象类型属性 表示
    private Dept dept;


    public void setDept(Dept dept) {
        this.dept = dept;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public void add() {
        System.out.println(ename + gender + dept);
    }
}
  
    <bean id="emp" class="cn.hncj.bean.Emp">
        
        <property name="ename" value="lucky">property>
        <property name="gender" value="">property>
        
        <property name="dept" ref="dept">property>
    bean>
    <bean id="dept" class="cn.hncj.bean.Dept">
        <property name="dname" value="财务部">property>
    bean>

在这里插入图片描述

3.2级联赋值第二种写法

public class Dept {
    //部门类
    private String dname;

    public void setDname(String dname) {
        this.dname = dname;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "dname='" + dname + '\'' +
                '}';
    }
}

public class Emp {
    //员工类
    private String ename;
    private String gender;
    //员工属于某一个部门,使用对象类型属性 表示
    private Dept dept;

    //生成dep的get方法

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public void add() {
        System.out.println(ename + gender + dept);
    }
}

   
    <bean id="emp" class="cn.hncj.bean.Emp">
        
        <property name="ename" value="lucky">property>
        <property name="gender" value="">property>
        
        <property name="dept" ref="dept">property>
        <property name="dept.dname" value="技术部">property>
    bean>
    <bean id="dept" class="cn.hncj.bean.Dept">
        <property name="dname" value="财务部">property>
    bean>

在这里插入图片描述

*相比于第一种级联赋值,第二种级联赋值方法中的员工类需要创建dept对象的getter方法,否则取不到dept对象。

总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了spring5概念和XML配置方式的使用,接下来的IOC管理XML方式学习内容请查看主页。

你可能感兴趣的:(spring,spring,intellij-idea,xml)