欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于java单例设计模式和spring框架核心容器功能的基础知识描述

程序员文章站 2022-06-17 18:00:02
...

关于java单例设计模式和spring框架核心容器功能的基础知识描述

Java设计模式:

从java语言的诞生到今天,很多java语言前辈在不断的开发项目和使用java语言的过程中遇到了很多问题,从而不断的解决和完善所遇到的这些问题,经过长时间的积累,形成了一些成功的设计开发模式,这就是java设计模式,其中有23种设计模式,其中一种是单例设计模式,下面让我们来了解一什么是单例设计模式。

java单例设计模式:

单例即保证只有一个实例,比如开发一个类,保证它是单例的类,只能创建一个实例,测试代码如下:

public class Student {
饿汉式单例
1、私有化构造方法
private Student() {}

2、定义一个静态的本类属性
static修饰的属性在内存中只会存一份
static属性会在类加载后第一时间初始化
private static Student s = new Student();

3、提供一个静态方法,返回唯一的实例
public static Student getInstance() {
return s;
}
}

测试多次调用静态方法获取实例,得到的都是唯一的实例,现在的Student类就是一个单例的类。

public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Student s1 = Student.getInstance();
Student s2 = Student.getInstance();
Student s3 = Student.getInstance();
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}

上述的单例类是饿汉式单例,创建实例比较早,类一加载就立即创建了实例,不会等到调方法获取。
还有一种懒汉式单例,创建实例比较晚,类加载时不会创建实例,当调方法获取时才会创建。
懒汉式单例

public class Student2 {
1、私有化构造方法
private Student2() {
System.out.println("--------");
}

2、定义一个静态的本类属性
static修饰的属性在内存中只会存一份
static属性会在类加载后第一时间初始化
private static Student2 s;

3、提供一个静态方法,返回唯一的实例
public static Student2 getInstance() {
if(s == null) {
s = new Student2();
}
return s; }
}

5、饿汉式单例是线程安全的,懒汉式单例是线程不安全的。

多线程测试
public class TestThread {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
//匿名内部类,实现了Runnable接口
new Thread(new Runnable() {
@Override
public void run() {
Student2 student = Student2.getInstance();
System.out.println(student);
}
}).start();创建线程并启动

          	 }               
   	 }

}

使用synchronize同步锁可以保证线程安全

synchronized添加在方法上,会把整个方法都锁住,锁的代码太多,锁的粒度太大。
使用双重锁(双重判定锁)可以只锁几行代码,提升性能,代码如下:

public static Student2 getInstance() {
if (s == null) {
synchronized (Student2.class) {
if (s == null) {
s = new Student2();
}
}
}
return s;
}

关于spring框架核心容器功能

spring框架也被称为春天框架,它是一个粘合剂类型的框架,管理项目中的对象。
下面是Spring模块架构图:

关于java单例设计模式和spring框架核心容器功能的基础知识描述

下面是关于上图的结构功能说明:

core container : 核心容器,是spring框架的基石,任何spring项目运行时都会生成一个容器,把项目运行时需要的对象全部管理起来。创建对象,销毁对象,对象关系的依赖。
test : 测试,可以与junit-4整合起来,测试容器中某些对象。
AOP : 面向切面编程,可以无耦合的给很多方法进行功能的增强。
data access : 数据访问,提供了jdbc模板,可以对数据库进行操作。还可以与其它的ORM框架,如hibernate进行整合使用。
transactions : 事务, spring提供了声明式事务功能,只需要对事务功能进行一次配置,就可以在所有的方法上增加事务。
web - struts : spring的web模块可以和struts框架整合起来使用。
web - mvc : spring开发了自己的一个控制层框架,叫做SpringMVC,代替struts2框架,从开发速度,运行效率上都比struts2要好。

其中Spring核心的两个概念功能很强大:

IOC : 控制反转,也叫DI,叫依赖注入。
控制反转:以前对象都是由程序员自己创建管理的,现在由Spring框架的容器来管理所有的对象。
要注意的是:容器本身也是对象
依赖注入:假如Student对象内部有个Clazz属性,就说明学生依赖一个班级。
AOP:面向切面(方面)编程。
实现的功能:解决日志记录,性能统计,安全控制,事务管理功能。

Spring核心容器有三种创建bean的方式:

1、构造方法创建bean
无参构造方法创建bean

2、静态工厂创建bean

3、实例工厂创建
指工厂里创建对象的方法是普通方法,非static的,只能用对象调用。

Spring核心容器给对象注入(给属性赋值)

1、构造方法注入(有参构造)代码如下:

配置spring.xml文件:

<constructor-arg index="0" value="22"/>        
<constructor-arg index="1" value="张三"/>        
<constructor-arg index="2" value="男"/>   
2、set方法注入(最常用,可以注入复杂的类型)

配置spring.xml文件:

property标签使用set方法注入,name需要和set方法名匹配      

<property name="dd" value="22"/>        
 <property name="name" value="张三"/>        
<property name="sex" value="男"/>   
3、注解注入(很好用,简单方便)

@Autowired 自动绑定
@Resource 资源
(注解注入一般用在对象类型的属性上,不在int,String等基本类型上使用)

配置spring.xml文件:
context:annotation-config/

@Autowired与@Resource的区别:

1、@Autowired是spring框架提供的注解,@Resource是jdk提供的注解。    
2、@Autowired根据类型绑定         @Resource先根据名字绑定,再根据类型绑定。