Java小白修炼手册--第五阶段-- Spring框架(day01)

目录

Spring

Spring简介

什么是Spring

为什么要用Spring?

Spring框架的作用

Spring的主要功能​

通过Spring框架创建对象,并获取对象

Spring容器

简介

Spring容器简介

Spring容器的实例化

Spring容器的使用

容器对Bean的管理

Bean的实例化

Bean的命名

由Spring管理的对象的作用域

Bean的作用域

Bean的生命周期回调

由Spring管理的对象的生命周期

Bean延迟实例化

通过组件扫描使得Spring管理类的对象


Spring

Spring简介

什么是Spring

  • Spring是一个开源的轻量级的应用开发框架,其目的是用于简化企业级应用程序开发,降低侵入性;
  • Spring提供的IOC和AOP功能,可以将组件的耦合度降至最低,即解耦,便于系统日后的维护和升级;
  • Spring为系统提供了-一个整体的解决方案,开发者可以利用它本身提供的功能外,也可以与第三方框架和技术整合应用,可以自由选择采用哪种技术进行开发。
     

为什么要用Spring?

Spring的本质是管理软件中的对象,即创建对象和维护对象之间的关系.
 

Spring框架的作用

Spring框架的主要作用是创建对象和管理对象。

创建对象:类似于User user = new User();

管理对象:随时可以通过Spring框架获取对象,甚至Spring框架还能够帮我们为对象的属性进行赋值等。


Spring的主要功能

通过Spring框架创建对象,并获取对象

在Eclipse中创建Maven Project,在创建过程中勾上Create a simple projectGroup Id填为cn.teduArtifact Id填为spring01

如果某个项目不会被其它项目所使用,只需要保证自身能独立运行,其实Group IdArtifact Id的值是多少,并不重要。

创建成功后,先在pom.xml中添加以上配置:

然后,对项目名称点击鼠标右键,选择Maven > Update Project以更新Maven,则当前环境会使用Java 1.8

接下来,需要在pom.xml中添加Spring框架所需的spring-context依赖的代码:

Spring容器

简介


Spring容器简介

  • 在Spring中,任何的Java类和JavaBean都被当成Bean 处理,这些Bean通过容器管理和使用。
  • Spring容器实现了IOC和AOP机制,这些机制可以简化Bean对象创建和Bean对象之间的解耦;
  • Spring容器有BeanFactory和ApplicationContext两种类型;

什么是JavaBean:一-种简单规范的Java对象
何时使用Spring?
当需要管理JavaBean对象时候就可以使用,Spring是最简洁的对象管理方案之一.
 

如何创建对象  如何管理对象之间关系
 


Spring容器的实例化

( 如何创建对象 )

ApplicationContext继承自BeanFactory接口,拥有更多的企业级方法,推荐使用该类型,实例化方法如下:
//加载工程classpath下的配置文件实例化
String conf = "applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(conf);


如何使用Spring?

  • 遵守Spring定义的规则,基于配置和默认规则,减少了代码的书写


Spring容器的使用

  • 从本质上讲, BeanFactory和ApplicationContext仅仅只是一个维护Bean定义以及相互依赖关系的高级工厂接口。通过BeanFactory和ApplicationContext我们可以访问bean定义。
  • 首先在容器配置文件applicationContext.xml中添加Bean定义
  • <bean id="标识符class="Bean类型"/>
  • 然后在创建BeanFactory和ApplicationContext容器对象后,调用getBean(方法获取Bean的实例即可
  • getBean("标识符")


容器对Bean的管理


Bean的实例化

  • Spring容器创建Bean对象的方法有以下3种
  • 用构造器来实例化 (重点)
  • 使用静态工厂方法实例化
  • 使用实例工厂方法实例化

将对象创建规则告诉Spring, Spring会帮你去创建对象;基于配置和默认规则,减少了代码的书写!


Bean的命名

Bean的名称
在Spring容器中,每个Bean都需要有名字(即标识符) ,该名字可以用< bean>元素的id或name属性指定
Bean的别名
为已定义好的Bean ,再增加另外一个名字引用,可以使用<alias>指定
<alias name="fromName" alias="toName' />

如果需要Spring管理某个类的对象,可以通过自定义的类进行配置!

例如存在需求:使得Spring框架管理Date类的对象!

先在项目的cn.tedu.spring包中创建Beans类,并且,在这个类中自定义方法,方法的返回值类型必须是Date,然后,自行在方法体中创建出Date对象并返回即可:

package cn.tedu.spring;

import java.util.Calendar;
import java.util.Date;
import java.util.Random;

import org.springframework.context.annotation.Bean;

public class Beans {

	@Bean
	public Date a() {
		return new Date();
	}
	
	@Bean
	public Random rrr() {
		return new Random();
	}

	@Bean
	public Calendar ccc() {
		return Calendar.getInstance();
	}
	@Bean
	public User uuu() {
		return new User();
	}
}

package cn.tedu.spring;

public class User {
	
	
}

以上使用的包名是自定义,并不是强制要求。

关于以上自定义的方法:

  • 应该使用public权限;

  • 返回值类型是需要Spring管理的对象所归属的类型;

  • 方法名称可以自定义;

  • 参数列表暂时为空;

  • 必须添加@Bean注解。

然后,就可以创建一个用于运行的类,加载以上类,并获取对象:

package cn.tedu.spring;

import java.util.Calendar;
import java.util.Date;
import java.util.Random;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Demo {
	public static void main(String[] args) {
		// 1.加载配置类 获取Spring 容器
		AnnotationConfigApplicationContext ac 
			= new AnnotationConfigApplicationContext(Beans.class);
		
		// 2.从 Spring 容器中获取对象
		Date date = (Date)ac.getBean("a");//getBean() 获取去参数时 配置对象的方法名称
		
		Random random = (Random) ac.getBean("rrr");
		Calendar calender = (Calendar) ac.getBean("ccc");
		User user =(User) ac.getBean("uuu");
		
		//3.测试
		System.out.println(date);
		System.out.println(random);
		System.out.println(calender);
		System.out.println(user);
		
		//4.关闭
		ac.close();
		
	}
}

运行以上代码,就可以看到输出的对象!

在以上Beans类中,配置对象的方法名是a,在运行的Demo类中,调用getBean()方法的参数也必须是"a",名称必须保持一致!

通过,获取某个值的方法的名称都应该是getXxx,所以,以上Beans类中的方法应该改为:

但是,一旦将方法名改成了getDate,运行时,调用的getBean( )方法的参数也应该改成getDate,例如改成:

很显然,这个getDate表示的是一个名称,而名称应该使用名词,而不应该使用动词作为前缀!

如果要解决这个问题,可以在@Bean注解中配置参数,例如:

小结:在运行时,调用的getBean()方法的参数值,默认情况下,是配置对象的方法的名称,如果配置对象的方法的@Bean注解添加了参数,则getBean()方法的参数就是@Bean注解中的参数!

其实,Spring推荐直接使用名词作为以上配置对象的方法名称,即推荐使用date作为方法名,而不是getDate作为方法名!该名词将用于getBean()方法的参数,毕竟这个方法定义好了以后,是由Spring框架去调用了,开发人员不需要自行调用该方法,为了简化代码的同时还保证getBean()代码的语义,推荐使用名词作为方法名称!

由Spring管理的对象的作用域

Spring管理的对象,在默认情况下,都是单例的!如果在配置对象的方法之前,补充添加@Scope注解,且注解参数配置为prototype时,就不是单例的了!例如:

注意:Spring与单例模式是两个不同的概念!

当需要同时使用多个注解时,各注解不区分先后顺序。

Spring管理的对象,在单例的情况下,默认是饿汉式的!如果希望调整为懒汉式的,则在配置对象方法的方法之前补充添加@Lazy注解即可:

Bean的作用域

Spring容器在实例化Bean时,可以创建以下作用域的Bean对象



Bean的生命周期回调

  • 指定初始化回调方法
  • 指定销毁回调方法,仅适用于singleton模式的bean
  • 提示:指定销毁回调方法,仅适用于singleton模式的bean
  • Spring会管理对象的创建过程
     

由Spring管理的对象的生命周期

生命周期:某个对象从创建到最终销毁会经历的历程!

通常,需要讨论生命周期时,对应的数据类型的对象都不是由开发人员自行维护的!

被容器维护的对象,都是由容器创建对象,并在适当的时候调用其中的某些方法的!而开发人员需要做的就是“确定满足某条件的时候应该执行什么任务”!也就是说,“容器决定什么时候执行,开发人员决定执行时做什么”。

学习生命周期的意义就是“知道在什么时候需要做什么事情”!

Servlet为例,其生命周期中会有几个特殊的方法,在特定的情况下会被调用,这些就称之为生命周期方法:

  • init( ):当Servlet被创建对象后,立即执行,且只执行1次,该方法适合编写一些初始化相关的代码;

  • service( ):当接收到匹配的请求后会被调用,接收到多少次请求,就执行多少次该方法;

  • destroy( ):当Servlet对象即将被销毁之前执行,且只执行1次,该方法适合编写一些与结束相关的代码,例如关闭等等。

当使用Spring框架后,某些类的对象交给Spring框架来管理了,那么,这些对象在什么时候被创建、什么时候被销毁,及创建过程和销毁过程中需要执行某些代码,对于开发人员来说,一定程度上是不可控的!

Spring框架允许用户在类中自定义最多2个方法,分别表示“初始化方法”和“销毁方法”,并且,Spring框架会在创建对象之后自动调用初始化方法,会在销毁对象之前调用销毁方法!关于方法的定义:

  • 访问权限:应该使用public权限;

  • 返回值类型:使用void

  • 方法名称:自定义;

  • 参数列表:空。

例如,在User类中自定义2个生命周期方法:

然后,在配置对象的方法之前的@Bean注解中配置这2个方法作为生命周期方法:

Bean延迟实例化

  • 在ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化
  • 如果不想让一个singleton bean在ApplicationContext初始化时被提前实例化,可以使用<bean>元素的Iazy-init= "true"属性改变
  • 一个延迟初始化bean将在第一次被用到时实例化
  • <bean id="exampleBean" lazy-init="true"
  •   class="com.foo.ExampleBean“/>
  • 在顶级的< beans/ >元素中的default-lazy-init属性,可以为容器所有<bean>指定延迟实例化特性
  • 适用于使用频率很低的单例对象

 

通过组件扫描使得Spring管理类的对象

假设存在User类,需要被Spring框架创建并管理对象,则必须先明确User类所在的包,然后,在用于运行的类Demo中,在AnnotationConfigApplicationContext的构造方法中,将包名作为构造方法的参数,例如:

//1.加载配置类 获取Spring 容器
		AnnotationConfigApplicationContext ac =
				new AnnotationConfigApplicationContext("cn.tedu.spring");

以上代码则表示“组件扫描”,当执行时,Spring框架会扫描指定的包中所有的内容,并且,自动创建各组件的对象并进行管理!

当然,并不是所有的类都是“组件”,如果要标识某个类是“组件”,必须在类的声明之前添加@Component注解!例如:

package cn.tedu.spring;

import org.springframework.stereotype.Component;
//组件
@Component
public class User {
	
}

从Spring容器中获取对象时,默认情况下,将类名的首字母改为小写,作为Bean的名称,用于调用getBean()方法的参数,例如:

User user = ac.getBean("user",User.class);

关于Bean的名称,如果类名首字母是大写,且第2个字母是小写,例如UserStudent,则Bean的名称就是将首字母改为小写即可,也就是userstudent!如果不满足该条件,例如类名是teacherIUserDao,则Bean的名称就是类的名称!

Spring框架也允许自定义Bean的名称,只要将自定义的名称配置在@Component注解参数中即可,例如:

package cn.tedu.spring;

import org.springframework.stereotype.Component;

@Component("stu")
public class Student {
	public void Student() {
		System.out.println("Student.Student()");
		// Java Bean:
	}
}

则以上类的对象被Spring管理时,Bean的名称就是"stu",后续,调用getBean()方法获取对象时,也必须使用这个名称来获取对象:

	Student student = ac.getBean("stu", Student.class);

猜你喜欢

转载自blog.csdn.net/c202003/article/details/107040568