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

牛客网项目——前置技术(一):Spring Ioc

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

牛客网项目——前置技术(一):Spring Ioc

文章目录
  • 1. 基本介绍
  • 2. 得到Spring Ioc容器
  • 3. bean管理:初始化及销毁
  • 4. 管理第三方bean
  • 5. 简化方法:自动装配 @Autowired
  • 6. 实际应用

1. 基本介绍

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

上述的方法除了开启TomCat,自动创建了Spring容器,会自动扫描某些包下某些bean。
会扫描配置类所在包和子包带有注解的内容,一共有四个注解()

在测试代码中启用配置类

@ContextConfiguration(classes = CommunityApplication.class)
2. 得到Spring Ioc容器

实现接口 ApplicationContextAware
重写方法 setApplicationContext
把容器暂存为 applicationContext
当程序启动之后,applicationContext 就会被传进来自动进行记录

@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
class CommunityApplicationTests implements ApplicationContextAware {

	private ApplicationContext applicationContext;

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

在测试方法中使用容器

	@Test //从容器获取bean
	public void testApplicationContext() {
		System.out.println(applicationContext);

		//通过接口名(类名)得到bean,@Primary 优先级高先被获取
		AlphDao alphDao = applicationContext.getBean(AlphDao.class);
		System.out.println(alphDao.select());

		//通过名字得到bean,并转成AlphDAO类型
		AlphDao alphDao1 = applicationContext.getBean("alphaHibernate", AlphDao.class);
		System.out.println(alphDao1.select());
	}


java.dao 包中内容

package com.psynowcoder.community.community.dao;

public interface AlphDao {
    String select() ;
}
package com.psynowcoder.community.community.dao;

import org.springframework.stereotype.Repository;

@Repository("alphaHibernate") //给bean一个名字
public class AlphaDaoHibernateImpl implements AlphDao{
    @Override
    public String select() {
        return "Hibernate";
    }
}
package com.psynowcoder.community.community.dao;

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

@Repository //开启扫描
@Primary //优先装配
public class AlphaDaoMyBatisImp implements AlphDao{
    @Override
    public String select() {
        return "MyBatis";
    }
}

3. bean管理:初始化及销毁
	@Test // 管理bean,初始化及销毁
	public void testBeanManagement() {
		AlphService alphService = applicationContext.getBean(AlphService.class);
		System.out.println(alphService);

		//被Spring容器管理的bean默认是单个实例,只初始化一次,销毁一次
		//将调用bean的注解@Scope("prototype")之后变成原型模式,每次重新创建。但是不经常这么做
		alphService = applicationContext.getBean(AlphService.class);
		System.out.println(alphService);
	}


java,service 包中内容

package com.psynowcoder.community.community.service;

import com.psynowcoder.community.community.dao.AlphDao;
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")
public class AlphService {
    public AlphService() {
        System.out.println("实例化AlphService");
    }
    
    @PostConstruct //在构造器之后调用
    public void init() {
        System.out.println("初始化AlphService");
    }

    @PreDestroy //销毁之前调用
    public void destroy() {
        System.out.println("销毁AlphService");
    }
}

4. 管理第三方bean

方法:写配置类,进行注解和声明

	@Test // 通过配置配管理外部bean
	public void testBeanConfig() {
		SimpleDateFormat simpleDateFormat =
				applicationContext.getBean(SimpleDateFormat.class);
		System.out.println(simpleDateFormat.format(new Date()));
	}

java.config 配置类

package com.psynowcoder.community.community.config;

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

import java.text.SimpleDateFormat;

@Configuration
public class AlphConfig {

    @Bean //方法名就是bean的名字
    public SimpleDateFormat simpleDateFormat() {
        //这个方法返回的对象将被装配到容器里
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    }
}

5. 简化方法:自动装配 @Autowired
	@Autowired //自动装配
	@Qualifier("alphaHibernate")//指定bean注入
	private AlphDao alphDao;

	@Autowired
	private AlphService alphService;

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

完整测试类如下:

package com.psynowcoder.community.community;

import com.psynowcoder.community.community.dao.AlphDao;
import com.psynowcoder.community.community.service.AlphService;
import org.junit.jupiter.api.Test;
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 java.text.SimpleDateFormat;
import java.util.Date;

@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
class CommunityApplicationTests implements ApplicationContextAware {

	private ApplicationContext applicationContext;

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

	@Test //从容器获取bean
	public void testApplicationContext() {
		System.out.println(applicationContext);

		//通过接口名(类名)得到bean,@Primary 优先级高先被获取
		AlphDao alphDao = applicationContext.getBean(AlphDao.class);
		System.out.println(alphDao.select());

		//通过名字得到bean,并转成AlphDAO类型
		AlphDao alphDao1 = applicationContext.getBean("alphaHibernate", AlphDao.class);
		System.out.println(alphDao1.select());
	}

	@Test // 管理bean,初始化及销毁
	public void testBeanManagement() {
		AlphService alphService = applicationContext.getBean(AlphService.class);
		System.out.println(alphService);

		//被Spring容器管理的bean默认是单个实例,只初始化一次,销毁一次
		//将调用bean的注解@Scope("prototype")之后变成原型模式,每次重新创建。但是不经常这么做
		alphService = applicationContext.getBean(AlphService.class);
		System.out.println(alphService);
	}

	@Test // 通过配置配管理外部bean
	public void testBeanConfig() {
		SimpleDateFormat simpleDateFormat =
				applicationContext.getBean(SimpleDateFormat.class);
		System.out.println(simpleDateFormat.format(new Date()));
	}

	@Autowired //自动装配
	@Qualifier("alphaHibernate")//指定bean注入
	private AlphDao alphDao;

	@Autowired
	private AlphService alphService;

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

6. 实际应用

controller处理浏览器请求——调用业务组件service——调用dao访问数据库

在 AlphService 中自动装配 alphDao,调用 select方法

package com.psynowcoder.community.community.service;

import com.psynowcoder.community.community.dao.AlphDao;
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")
public class AlphService {

    @Autowired // 自动装配,service依赖于dao
    private AlphDao alphDao;

    public AlphService() {
        System.out.println("实例化AlphService");
    }

    @PostConstruct //在构造器之后调用
    public void init() {
        System.out.println("初始化AlphService");
    }

    @PreDestroy //销毁之前调用
    public void destroy() {
        System.out.println("销毁AlphService");
    }

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

同理 controller 调用 service

package com.psynowcoder.community.community.controller;


import com.psynowcoder.community.community.service.AlphService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/alpha")
public class AlphaController {

    @Autowired
    private AlphService alphService;

    @RequestMapping("/hello")
    @ResponseBody
    public String sayHello() {
        return "Hello Spring Boot.";
    }

    @RequestMapping("/data")//浏览器访问前提
    @ResponseBody
    public String getData() {
        return alphService.find();
    }
}

启动整个项目,访问指定页面

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

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

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