Spring基础

1.Spring简介

1.1 Spring 全家桶

  • Spring Framework (基础)
  • Spring Boot
  • Spring Cloud 微服务(项目大,拆分成若干子项目,再集成)
  • Spring Cloud Data Flow (数据集成的功能)

1.2 Spring Framework

  • Spring Core(IOC面向对象,AOP面向切面)
  • Spring Data Access(Transaction,Spring MyBatis)
  • Web Servlet (Spring MVC)
  • Integration(Email,Scheduling,AMQP,Security)

1.3 Spring IOC

  • Inverse of Control(控制反转,是一种面向对象的思想)
  • Dependency Injection (依赖注入,IOC思想的实现方式)
  • IOC Container (是实现依赖注入的方式,本质上是一个工厂)

2.Spring 基础

2.1 Spring的使用方法

根据官网介绍,大致要做两件事

  • 提供Bean的类型
  • 提供配置文件(描述Bean的关系)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DefaultTmpMvnApplication {

	public static void main(String[] args) {
		SpringApplication.run(DefaultTmpMvnApplication.class, args);
	}

}

被@SpringBootApplication标注的类,就相当于配置文件。
Spring 让其被创建,会自动扫描某些包下的某些Bean,装配某些类
看@SpringBootApplication的底层
@SpringBootConfiguration
@EnableAutoConfiguration (自动配置)
@ComponentScan (组件扫描,会扫描某些配置类所在的包以及其子包)

具体扫描带有一下注解的

  • @Component 任何地方都可以使用
  • @Controller 处理请求
  • @Service 业务组件
  • @Repository 数据库访问

下面介绍相应用法
在项目目录中创建一个包,包名dao
创建一个接口,AlphaDao

public interface AlphaDao {
    public String select();
}

两个实现,

import org.springframework.stereotype.Repository;

@Repository("AlphaDaoHibernate")
public class AlphaDaoHibernateImpl implements AlphaDao {
    public String select() {
        return "Hibernate";
    }
}

加了注解@Repository,并且给了名字

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;
@Repository
@Primary
public class AlphaDaoMyBatisImpl implements AlphaDao {
    @Override
    public String select() {
        return "MyBatis";
    }
}

@Primary指定了Spring容器自动加载这一类
测试类

import com.example.demo.dao.AlphaDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeansException;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.test.context.ContextConfiguration;

@SpringBootTest
@ContextConfiguration(classes = DefaultTmpMvnApplication.class)
class DefaultTmpMvnApplicationTests implements ApplicationContextAware{
	private ApplicationContext applicationContext;
	@Test
	void contextLoads() {
		System.out.println(applicationContext);
	}
	@Test
	void testApplicationContext2() {
		AlphaDao alphaDao = applicationContext.getBean("AlphaDaoHibernate",AlphaDao.class);
		System.out.println(alphaDao.select());
	}
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext = applicationContext;
	}
}

解释下定义该测试类的重点
@ContextConfiguration(class=类型) 指定了测试代码中设置配置类信息
实现了ApplicationContextAware接口,并且实现其中的setApplicationContext方法,该方法传入的参数就是我们要的Spring容器。把这个容器存在成员变量里边即可。

容器中的对象,默认是单例,如果想不是单例,则加一个@Scope('“prototype”)在Bean上

如何装配第三方类?
通过自己写一个配置类,通过Bean注解声明
定义一个配置类,类似于@SprintBootApplication ,用@Configuration足够
示例: 装配SimpleDateFormat
下文中的方法AlphaConfig,该方法返回的对象将会装配到容器里,对应的Bean的名字就是方法名

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.text.SimpleDateFormat;

@Configuration
public class AlphaConfig {

    @Bean
    public SimpleDateFormat simpleDateFormat() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    }
}

测试(使用)上文定义的Bean

import org.junit.jupiter.api.Test;
import org.springframework.beans.BeansException;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.test.context.ContextConfiguration;
import java.text.SimpleDateFormat;
import java.util.Date;

@SpringBootTest
@ContextConfiguration(classes = DefaultTmpMvnApplication.class)
class DefaultTmpMvnApplicationTests implements ApplicationContextAware{


	private ApplicationContext applicationContext;

	@Test
	void testBeanConfig(){
		SimpleDateFormat simpleDateFormat
				= applicationContext.getBean(SimpleDateFormat.class);
		System.out.println(simpleDateFormat.format(new Date()));

	}


	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext = applicationContext;
	}
}

上文中,我们是主动获取容器拿来用,还有自动注入的方法
@Autowired 可以加载构造器前,也可以加在属性前
@Qualifier(“alphaHibernate”)

import com.example.demo.dao.AlphaDao;
import com.example.demo.service.AlphaService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import java.text.SimpleDateFormat;

@SpringBootTest
@ContextConfiguration(classes = DefaultTmpMvnApplication.class)
class DefaultTmpMvnApplicationTests {
	@Autowired
	@Qualifier("AlphaDaoHibernate")
	private AlphaDao alphaDao;
	@Autowired
	private AlphaService alphaService;
	@Autowired
	private SimpleDateFormat simpleDateFormat;
	@Test
	void testAutowired(){
		System.out.println(this.alphaDao);
		System.out.println(this.alphaService);
		System.out.println(this.simpleDateFormat);
	}
}

Dependency Injection
依赖注入的优点:降低了耦合度,不用实例化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值