Spring入门

Spring入门,第1张

Sprign Framework:Spring框架,是Spring中最早最核心的部分 也是其他技术的基础

SpringBoot:Spring是来简化开发,而SpringBoot是来帮助Spring在简化的基础上能更快速进行开发。

  • SpringCloud:这个是用来做分布式之微服务架构的相关开发。

IOC部分 bean的实例化

实例化bean的三种方式,构造方法,静态工厂实例工厂

bean本质上就是对象,对象在new的时候会使用构造方法完成,那创建bean也是使用构造方法完成的。

1 构造方法实例化(常用)

Spring底层使用无参构造方法创建对象,在没有有参构造器的时候默认有无参构造器,因此使用构造方法实例化bean时直接在配置文件中配置即可

public class BookDaoImpl implements BookDao {

    @Override
    public void save() {
        System.out.println("dao save");
    }
}
//测试bean实例化
public class TestDemo2 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        BookDaoImpl bookDao = context.getBean("bookDao", BookDaoImpl.class);
        bookDao.save();
    }
}

运行结果:

为了验证是通过无参构造方法获取的 在无参构造方法中输出一句话验证

public class BookDaoImpl implements BookDao {

    public BookDaoImpl() {
        System.out.println("无参构造方法执行");
    }

    @Override
    public void save() {
        System.out.println("dao save");
    }
}

 运行结果:

 2 静态工厂实例化(了解)

3 实例工厂与FactoryBean

bean的基础配置

    
//测试bean基础配置
public class TestDemo2 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        BookDaoImpl bookDao1 = context.getBean("dao", BookDaoImpl.class);
        BookDaoImpl bookDao2 = context.getBean("dao", BookDaoImpl.class);
        System.out.println(bookDao1);
        System.out.println(bookDao2);
    }
}

测试结果:

 


    
//测试bean基础配置
public class TestDemo2 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        BookDaoImpl bookDao1 = context.getBean("bookDao", BookDaoImpl.class);
        BookDaoImpl bookDao2 = context.getBean("bookDao", BookDaoImpl.class);
        System.out.println(bookDao1);
        System.out.println(bookDao2);
    }
}

 测试结果:

 

id:bean唯一标识

class:bean的类全名 必须为实现类

name:起别名 可起多个 使用(,)(;)( 空格)分割

scope:作用范围 

prototype:多例,多次获取的bean为多个
singleton:单例(默认) 多次获取的bean为同一个
bean的生命周期

1 在配置文件中的bean标签中添加init-methoddestroy-method属性

2 类实现InitializingBeanDisposableBean接口,了解

关闭容器的两种方式

ConfigurableApplicationContext是ApplicationContext的子类
close()方法
registerShutdownHook()方法
DI 属性注入 

setter注入

setter引用类型注入

1.在BookServiceImpl中声明bookDao属性

private BookDao bookDao;

2.为bookDao属性提供setter方法 

public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

3.在配置文件中使用property标签注入




        
    
//测试DI属性注入
public class TestDemo1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        bookService.save();
    }
}

 运行结果:

setter简单类型注入

public class UserDaoImpl implements UserDao {

    private String userName;

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Override
    public void name() {
        System.out.println("username is "+userName);
    }
}

        
//测试DI属性注入
public class TestDemo4 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        UserDaoImpl userDao = context.getBean("userDao", UserDaoImpl.class);
        userDao.name();
    }
}

运行结果:

 

 

构造器注入 构造器引用类型注入

1.将bookDao的setter方法删除掉

2.添加带有bookDao参数的构造方法

public class BookServiceImpl implements BookService {

    private BookDao bookDao;

    public BookServiceImpl(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void save() {
        System.out.println("service save");
        bookDao.save();
    }
}

3.在applicationContext.xml中配置

 
    
        
    
//测试DI属性注入
public class TestDemo1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        bookService.save();
    }
}

 测试结果:

 

构造器简单类型注入

public class UserDaoImpl implements UserDao {

    private String userName;

    public UserDaoImpl(String userName) {
        this.userName = userName;
    }

    @Override
    public void name() {
        System.out.println("username is "+userName);
    }
}

        
    
//测试DI属性注入
public class TestDemo4 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        UserDaoImpl userDao = context.getBean("userDao", UserDaoImpl.class);
        userDao.name();
    }
}

测试结果:

 

依赖自动装配

依赖注入,需要注意一些其他的配置特征:

  1. 自动装配用于引用类型依赖注入,不能对简单类型进行 *** 作

  2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用

  3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用

  4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

集合注入
public class ListDaoImpl implements ListDao {

    private int[] array;

    private List list;

    private Set set;

    private Map map;

    private Properties properties;

    public void setArray(int[] array) {
        this.array = array;
    }

    public void setList(List list) {
        this.list = list;
    }

    public void setSet(Set set) {
        this.set = set;
    }

    public void setMap(Map map) {
        this.map = map;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    @Override
    public void testDemo() {

        System.out.println("book dao save ...");

        System.out.println("遍历数组:" + Arrays.toString(array));

        System.out.println("遍历List" + list);

        System.out.println("遍历Set" + set);

        System.out.println("遍历Map" + map);

        System.out.println("遍历Properties" + properties);
    }
}
 
        
            
                100
                200
                300
            
        
        
            
                yuanyuan1
                yuanyuan2
                yuanyuan3
            
        

        
            
                mysql
                mysql
                java
            
        
        
            
                
                
            
        
        
            
                China
                Chinese
            
        
    
//测试DI属性注入
public class TestDemo5 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        ListDaoImpl listDao = context.getBean("listDao", ListDaoImpl.class);
        listDao.testDemo();
    }
}

测试结果:

 property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写、标签
List的底层也是通过数组实现的,所以``和``标签是可以混用
集合中要添加引用类型,只需要把``标签改成``标签,这种方式用的比较少

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/730605.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存