SpringBoot开发二

需求介绍-Spring入门

主要是理解IOC,理解容器和Bean

代码

Test里面利用getBean方法帮助我们看一下容器的创建:

那我首先要写一个Bean对象,假设是写一个访问数据库类。

AlphaDaointerface)类型:

package com.nowcoder.community.dao;

public interface AlphaDao {
    String select();
}

然后写两个类实现这个接口体验利用容器好处:

AlphaDaoHibernatelmpl

package com.nowcoder.community.dao;
import org.springframework.stereotype.Repository;

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

AlphaDaoMybatisImpl

package com.nowcoder.community.dao;

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;

@Repository
@Primary // 具有更高优先级
public class AlphaDaoMyBatisImpl implements AlphaDao{
@Override
public String select() {
return "MyBatis";
}
}

这个时候就有两个Bean对象,可以通过容器管理了。

其次呢,Spring容器还可以管理bean的声明周期,实现一些业务逻辑,那我们重新再写一个Bean

AlphaService

package com.nowcoder.community.service;

import com.nowcoder.community.dao.AlphaDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Service
@Scope //("prototype"):表示Bean实例有多个,每次get就实例化一个。默认单例。
public class AlphaService {

    @Autowired
    private AlphaDao alphaDao;
    //被Spring容器管理的bean只被实例化一次,因为它是单例的
    public AlphaService() {
        System.out.println("实例化AlphaService");
    }
    //初始化在构造器之后
    @PostConstruct
    public void init() {
        System.out.println("初始化AlphaService");
    }
    //销毁之前调用,释放某些资源
    @PreDestroy
    public void destroy() {
        System.out.println("销毁AlphaService");
    }

    public String find() {
        return alphaDao.select();
    }

}

 

上面我们都是自己写的Bean,但是有的时候我们希望能在容器中加载一个第三方的Bean

那我们就需要自己写一个配置类,在配置类中通过Bean注解进行申明,那么就开始写一个配置类。

所有第三方的都写在config这个包里面:

AlphaConfig

package com.nowcoder.community.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.text.SimpleDateFormat;

//配置类,加载第三方的bean
@Configuration
public class AlphaConfig {
    @Bean
    public SimpleDateFormat simpleDateFormat() {//方法名就是bean的名字
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    }
}

 

但是这种都是自己去主动去获取,我们其实可以通过依赖注入来实现。

在使用之前进行申明就可以了,使用这个@Autowired注解。

上面都是bean声明,下面就是一个具体的测试的方法了。

CommunityApplicationTests

 

package com.nowcoder.community;

import com.nowcoder.community.dao.AlphaDao;
import com.nowcoder.community.service.AlphaService;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

import java.text.SimpleDateFormat;
import java.util.Date;

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
class CommunityApplicationTests implements ApplicationContextAware {
    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    @Test
	public void testApplicationContext() {
    	System.out.println(applicationContext);
		AlphaDao alphaDao = applicationContext.getBean(AlphaDao.class);
		System.out.println(alphaDao.select());

		alphaDao = applicationContext.getBean("AlphaHibernate", AlphaDao.class);
		System.out.println(alphaDao.select());
	}

	@Test
	public void testBeanManagement() {
		AlphaService alphaService = applicationContext.getBean(AlphaService.class);
		System.out.println(alphaService);
	}

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

	@Autowired
	@Qualifier("AlphaHibernate")// 加载特指的Bean
	private AlphaDao alphaDao;

    @Autowired
	private AlphaService alphaService;

    @Autowired
	private SimpleDateFormat simpleDateFormat;

    // 测试依赖注入
    @Test
	public void testDI() {
		System.out.println(alphaDao);
		System.out.println(alphaService);
		System.out.println(simpleDateFormat);
	}
}

  

posted @ 2021-05-31 20:08  宋同学shl  阅读(84)  评论(0)    收藏  举报