文章内容速览
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,输出如下: