栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring01—如何使用spring

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring01—如何使用spring

目录

 如何使用spring

BeanFactory和ApplicationContext的区别

BeanFactory和ApplicationContext区别:

bean的作用范围:

什么是DI?

使用xml配置文件方式注入 

自动注入(使用xml显示配置)

使用注解完成自动注入

给基本类型属性赋值


 如何使用spring

(1)引入相关的依赖


        
            org.springframework
            spring-webmvc
            5.2.15.RELEASE
        
    

引入一个springmvc jar包,相当于引入了有关spring 的需要的jar包,省事。

写一个接口以及写接口的两个实现类 

配置spring 的配置文件,注册一个类,这个类会被spring托管。

  

测试:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        UserDao dao = (UserDao)applicationContext.getBean("dao");
        dao.m();
        System.out.println(dao.toString());

 注册到spring的这个类的对象被创建了。

BeanFactory和ApplicationContext的区别

Spring容器顶层接口:获取Bean对象;管理类和类之间的关系(依赖关系)BeanFactory由org.springframework.beans.factory.BeanFactory接口定义 BeanFactory是工厂模式(Factory pattern)的实现,是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

BeanFactory接口包含以下基本方法:

containsBean(String beanName) 判断工厂中是否包含给定名称的bean定义,若有则返回true。

Object  getBean(String  str) 返回给定名称注册的bean实例。根据bean的配置情况,如果是singleton模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定bean,该方法可能会抛出异常。

Object  getBean(String, Class) 返回以给定名称注册的bean实例,并转换为给定class类型

Class  getType(String name) 返回给定名称的bean的Class,如果没有找到指定的bean实例,则排除NoSuchBeanDefinitionException异常

boolean  isSingleton(String) 判断给定名称的bean定义是否为单例模式      

String[]  getAliases(String name) 返回给定bean名称的所有别名

  

测试这个方法: 

  UserDao dao = applicationContext.getBean("dao", UserDao.class);

 跟据配置在spring配置文件的id名,以及对应的类型,可以直接得到注册类的对象。无需手动由object类型强制转换成对应的类型。

ApplicationContext接口

是基于BeanFactory的,提供了应用程序框架服务,扩展的新功能如下:提供国际化的支持资源访问,如URL和文件 事件传递载入多个配置文件等 实现类常见有三个

ClassPathXmlApplicationContext:-classpath路径加载xml文件的

FileSystemXmlApplicationContext:基于项目根路径进行加载xml文件的

AnnotationConfigApplicationContext:基于注解的配置。基于类书写的配置。

public static void main(String[] args) {
        
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        UserDao dao = applicationContext.getBean("dao", UserDao.class);
        dao.m();
        System.out.println(dao.toString());
        
    }

BeanFactory和ApplicationContext区别:

面试题:BeanFactory 和 ApplicationContext 的区别:
BeanFactory 才是 Spring 容器中的顶层接口。
ApplicationContext 是它的子接口。
单例模式下创建对象的时间点不一样:
ApplicationContext:(饿汉模式)只要一读取配置文件,马上就会创建配置文件中配置的对象。
BeanFactory:(懒汉模式)什么时候getBean("id"),也就是说当根据id获取对象时,才会创建。


选择:饿汉式:

bean的作用范围:

bean对象的作用范围调整需要配置scope属性,设置单例还是多例(只针对ApplicationContext接口来说,默认是单例的)

单例:---无论创建多少次对象 他们始终指向同一个实例。

scope:常用 singleton,prototype

singleton:单例的(默认值)当加载配置文件时,就会创建对象。

prototype:多例的(当getBean时才会创建对象)

request:作用于请求范围---同一个那么使用bean同一个。

session:作用于会话范围---同一个会话

作用范围为:singleton 单例模式,对象只会被创建一次,再次创建时也会指向同一个地址。 是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。

 作用范围:prototype,Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。

什么是DI?
  • 依赖注入(Dependency Injection,DI)。

  • 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 .

  • 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 .

对依赖注入的理解:
首先了解关于注入的两个概念IOC(控制反转)和DI(依赖注入),简单的说,IoC是一种思想,而DI则是一种行为。也可以说IoC是目的,DI是手段。IoC是指让生成类的方式由传统方式(new)反过来,开发程序时不需要调用new,当需要使用某个类的时候由框架来注入(DI)即可。
 

使用xml配置文件方式注入 

1、常量(string)注入

 

 
        
        
    

 2、引用类型注入

 

3、数组、集合注入

list集合         

            
                唱歌
                跳舞
                哈啤酒
            
        
数组
        
            
                三国演义
                红楼梦
                水浒传
                西游记
            
        
map
        
            
                
                
            
        
set(不可重复,重复了只会出现一个)
        
            
                12
                12
                12
            
        

自动注入(使用xml显示配置) 

不用在显示在配置bean时,不使用ref,而是使用autowire

 autowire(自动装配的类型,一般使用byName 或 byType),一种是按照名字,一种是按照类型

1、 No:即不启用自动装配。Autowire默认的值。
 
2、 byName:通过比如说类属性的名字的方式查找JavaBean依赖的对象并为其注入。Computer有个属性printer,指定其autowire属性为byName后,Spring IoC容器会在配置文件中查找id/name属性为printer的bean,然后使用Seter方法为其注入。
 
3、 byType:通过属性的类型查找JavaBean依赖的对象并为其注入。比如类Computer有个属性printer,类型为Printer,那么,指定其autowire属性为byType后,Spring IoC容器会查找Class属性为Printer的bean,使用Seter方法为其注入。
 
4、 constructor:通byType一样,也是通过类型查找依赖对象。与byType的区别在于它不是使用Seter方法注入,而是使用构造子注入。
 
5、 default:由上级标签的default-autowire属性确定 


    
    
        
        
    

自动注入的简化版-->使用注解完成自动注入

@autowire详解

@Autowired 注解可以对成员变量、构造方法、方法进行标注,来完成自动装配工作;放在成员变量上,也可以放在成员变量的set()方法上,也可以放在任意方法上表示自动执行当前方法,如果方法有参数,会在IOC容器中自动寻找同类型参数为其传值。

需要明确的是:@Autowired 是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Qualifier使用;

         当@Autowired 注解放在成员变量上时,不需要写成员变量的getter、setter方法

当使用@Autowired 注解时,不写对应getter、setter方法,Spring会通过Java的“反射机制”来实现属性的依赖注入:

       Java允许用户关闭【属性】或者【方法】的【访问权限】;也就是说,本来你的属性或者方法声明了【private】,在访问类中的这个private标识的某个属性时,Java首先会进行一个【安全检查】,确认以下你要访问的这个属性的访问权限是什么,如果是【public】,那么就直接访问;如果是【private】,则不能访问该类中的私有属性。

       按照正常的操作是这样的,但是Java还提供了一个方法,能够让你关闭属性或者方法的【访问控制权限】,比如即使声明了某个属性是private的,但是仍然还是可以通过【类.属性】的方式直接访问这个私有属性。这就是反射框架中:
 

(1)组件扫描配置文件

   

 (2)在类上添加注解 @component或者

(@service、@controller、@Repository)

//表示控制层注解,如何没有设置bean的id 默认为类的名称首字母小写   相当于在spring配置文件钟

@Controller+@Respository+@Service+@Component
没有区别: 他们的底层都是用的@Component
实际意思就在于区分层的。
@Controller控制层
@Respository持久化层
@Service 业务层
@Component 最底层的bean注解。

在对应的引用数据类型上加上@autowire注解(默认是按照类型进行匹配,如果存在多个相同类型的类,则需要加入@Respository(value=“类名首字母小写”)注解,先按照类型进行匹配,后按照名字进行匹配,注意:使用这个注解之后,可以不写对应的set方法)

​

@Service
public class UserService {
    @Qualifier("userDao2")
    @Autowired(required = false)
    private Dao dao;
    public void show(){
        dao.show();
    }

}

autowire中有个默认的属性(required=true)它表示它依赖的这个引用类型对应的类必须存在,如果不存在,启动之后就会报错。

(required=false)后,这个引用数据类型对应的类不存在也不会报错,而是显示其为null

​

注意:@autowire注解写在属性上,就是使用的 

给基本类型属性赋值

@value:可以在属性上直接使用,也可以在在属性对应的set方法上使用

    @Value("20.0")
    private double price;
    @Value("lwh")
    public void setName(String name) {
        this.name = name;
    }

使用

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/972982.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号