【仿牛客社区项目】02.Spring入门


Java项目学习笔记,课程链接:
仿牛客项目

1.Spring全家桶

  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Cloud Data Flow

2.Spring Framework

  • Spring Core:IoC(面向对象)、AOP(面向切面)
    用来管理对象的两种思想

  • Spring Data Access:Transactions(管理事务)、Spring MyBatis(整合MyBatis)

  • Web Servlet:Spring MVC

  • Integration:Email、Scheduling、AMQP、Security

3.Spring IoC

  • Inversion of Control(IoC):控制反转,是一种面向对象编程的设计思想。

  • Dependency Injection:依赖注入,是IoC的实现方式。

  • IoC Container:IoC容器,是实现依赖注入的关键,本质上是一个工厂。

  • 代码讲解:

    ①public class CommunityApplication:

    配置类,由@SpringBootApplication注解标注的类就表示该类为配置文件。
    配置类CommunityApplication会扫描部分Bean,Bean需要满足以下条件才会被扫描:

     a.配置类所在的包(controller)以及其子包下面的部分Bean。
     b.Bean上必须有@Controller,@Service,@Repository,@Component这四个注解的任意一个。其中@Component是其他三个注解的父类。
    

    ②在test中演示IoC代码的运用

    a.如何使test中的类CommunityApplicationTests也使用正式运行代码中的配置类CommunityApplication?

    在CommunityApplicationTests前加上注解:

    @ContextConfiguration(classes = CommunityApplication.class)
    

    b.如何创建Spring容器?

    哪个类想得到Spring容器,就在他后面加上ApplicationContextAware接口,再实现一个方法setApplicationContext。
    例如想在CommunityApplicationTests中添加容器,加上:

    class CommunityApplicationTests implements ApplicationContextAware
    

    将光标移到ApplicationContextAware上,按快捷键Alt+Shift+Enter,选择Implememt method,applicationContext即为Spring容器。其中ApplicationContext是BeanFactory的子接口,用来定义容器

    @SpringBootTest
    @ContextConfiguration(classes = CommunityApplication.class)
    class CommunityApplicationTests implements ApplicationContextAware {
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    
        }
    }
    

    c.如何创建Bean?

    在com.nowcoder.community下创建一个子包dao,在dao下定义一个接口AlphaDao,再在dao下定义一个类AlphaDaoHibernateImpl来实现接口中的方法,类AlphaDaoHibernateImpl定义的对象就是Bean对象。

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

    d.如何用建立的容器管理Bean?

    调用容器applicationContext的getBean方法,参数可以是接口AlphaDao,也可以是类AlphaDaoHibernateImpl。运行alphaDao中的方法select()是否成功,从而看出容器是否成功获取到了Bean对象。

    @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());
        }
    }
    

    运行testApplicationContext,成功输出Hibernate,证明容器applicationContext成功获取到了Bean对象alphaDao。


    e.Spring容器优势?

    在dao下再创建一个类AlphaDaoMyBatisImpl来实现接口AlphaDao中的selec()方法,如果想用类AlphaDaoMyBatisImpl替换之前的类AlphaDaoHibernateImpl,也就是在容器调用Bean对象时,调用的是AlphaDaoMyBatisImpl而不是AlphaDaoHibernateImpl,只需在类AlphaDaoMyBatisImpl前添加注解@Primary。

    @Repository
    @Primary
    public class AlphaDaoMyBatisImpl implements AlphaDao{
        @Override
        public String select() {
            return "MyBatis";
        }
    }
    


    上述方法可以将Bean对象从类AlphaDaoHibernateImpl全部替换为类AlphaDaoMyBatisImpl,那如果只是想替换部分的该怎么做呢?

    给Bean对象取名字,强制容器返回特定的Bean对象。在@Repository后加上给Bean对象取的新名字"alphaHibernate",在容器调用Bean对象时,传入新名字"alphaHibernate"作为参数:

    @Repository("alphaHibernate")
    public class AlphaDaoHibernateImpl implements AlphaDao{
    
        @Override
        public String select() {
            return "Hibernate";
        }
    }
    
    	@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());
        }
    

    先输出MyBatis,再输出Hibernate
    在这里插入图片描述



    上面用来定义的Bean对象的类都是自己写的,例如类AlphaDaoMyBatisImpl,类AlphaDaoHibernateImpl。在这些类的前面加上注解(@Controller,@Service,@Repository,@Component),该类定义的对象即可成为能够被容器调用的Bean对象。

    可如果需要用一个别人写的类来定义Bean对象该怎么做呢?别人的类往往都打包好了,无法在类前加上注解。
    首先要自己写一个配置类,在com.nowcoder.community下新建子库config,再在config下定义类AlphaConfig作为配置类,并且在类前加上注解@Configuration,表示其是一个普通的配置类。这里选用的第三方类是SimpleDateFormat,在配置类中通过@Bean注解声明。
    不懂为啥这么写…

    @Configuration
    public class AlphaConfig {
    
        @Bean
        public SimpleDateFormat simpleDateFormat(){
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
    }
    
    	@Test
        public void testBeanConfig(){
            SimpleDateFormat simpleDateFormat =
                    applicationContext.getBean(SimpleDateFormat.class);
            System.out.println(simpleDateFormat.format(new Date()));
        }
    

    输出当前时间:
    在这里插入图片描述



    f.依赖注入简单使用
    	@Autowired
        @Qualifier("alphaHibernate")
        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);
        }
    


    g.项目中依赖注入演示

    简单来说,就是Controller调用Service,Service调用dao。
    在类Alphacontroller中注入alphaService对象,并调用其find()方法;在类AlphaService中注入alphaDao对象,并调用其select()方法;由于注入的alphaDao对象是默认优先级的,因此会调用类AlphaDaoMyBatisImpl中的具体实现的select()方法。

    @Controller
    @RequestMapping("/alpha")
    
    public class Alphacontroller {
    
        @Autowired
        private AlphaService alphaService;
    
        @RequestMapping("/hello")
        @ResponseBody
        public String savHello(){
            return "Hello Spring Boot.";
        }
    
        @RequestMapping("/data")
        @ResponseBody
        public String getData(){
            return alphaService.find();
        }
    }
    
    @Service
    public class AlphaService {
    
        @Autowired
        private AlphaDao alphaDao;
    
        public String find(){
            return alphaDao.select();
        }
    }
    
    public interface AlphaDao {
        String select();
    }
    

    运行CommunityApplication,输出如下:
    在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值