java做一些框架基础组件开发_Spring开发1 Spring基础及组件使用

相比 Spring Boot  以及  Spring MVC ,  Spring组件使用比较多

Spring是一种开源轻量级的框架,解决JavaEE的解决方案。

“一站式”

spring--->IOC-DI依赖注入

Dog dog = new Dog();

application.xml---->声明

strcut ---> 重

spring使用注解代替xml  ---> 轻量级

支持模块调用,坚持不重新造轮子。

Spring Core

Spring context

Spring Web

Spring MVC

Spring DAO     简化JDBC编码

Spring ORM    ORM框架

Spring AOP  面向切面编程   切片

class Test{}  bean---> 实例化

AOP

@Watch("")

public void watchMovie(){

}

@Result("")

public

对事务拦截,对方法保护,增强。  事务完整性

spring资源包

4.0.0

com.enjoy

spring-anno

1.0-SNAPSHOT

org.springframework

spring-context

5.1.3.RELEASE

XML 与 Bean 操作

XML

packagecom.enjoy.cap1;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;public classMainTest1 {public static voidmain(String args[]){/*把beans.xml的类 加载到容器中*/

//读beans.xml

ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");//初始化 IOC容器:MAP//从容器中获取bean

Person person = (Person) app.getBean("person");

System.out.println(person);

}

}

Bean开发

packagecom.enjoy.cap1.config;importcom.enjoy.cap1.Person;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;//配置文件 spring 注解的方式将bean加载到容器当中去

@Configurationpublic classMainConfig {//获取person的方法

@BeanpublicPerson person(){return new Person("jamees", 20);

}//这个方式和刚才写xml的效果是一样的,但是这个当时更加简洁

}

1 packagecom.enjoy.cap1;2

3 importcom.enjoy.cap1.config.MainConfig;4 importorg.springframework.context.ApplicationContext;5 importorg.springframework.context.annotation.AnnotationConfigApplicationContext;6

7 public classMainTest2 {8 public static voidmain(String args[]){9

10 ApplicationContext app = new AnnotationConfigApplicationContext(MainConfig.class);11 /**AnnotationConfigApplicationContext 容器类 **/

12

13 //容器中获取bean

14 Person person = (Person) app.getBean("person01");15

16 System.out.println(person);17

18 String[] nameForBean = app.getBeanNamesForType(Person.class);19 for(String name:nameForBean){20 System.out.println(name);21 }22

23 }24 }

@Configuration  配置类

@ComponentScan扫描规则

1.指定扫描范围

2.扫描过滤器

3.自定义过滤规则

test 作用域

b01841cd2358983fb4621d0bb6330390.png

1 importcom.enjoy.cap2.config.Cap2MainConfig;2 importorg.junit.Test;3 importorg.springframework.context.annotation.AnnotationConfigApplicationContext;4

5 public classCap2Test {6

7 @Test8 public voidtest01(){9 AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Cap2MainConfig.class);10 //相关东西加载到容器中

11

12 String[] names =app.getBeanDefinitionNames();13

14 for(String name:names){15 System.out.println(name);16 }17 }

org.springframework.context.annotation.internalConfigurationAnnotationProcessor

org.springframework.context.annotation.internalAutowiredAnnotationProcessor

org.springframework.context.event.internalEventListenerProcessor

org.springframework.context.event.internalEventListenerFactory

cap2MainConfig

orderConteroller

orderDao

orderService

person01

1 packagecom.enjoy.cap2.config;2

3

4 importcom.enjoy.cap1.Person;5 importorg.springframework.context.annotation.Bean;6 importorg.springframework.context.annotation.ComponentScan;7 importorg.springframework.context.annotation.Configuration;8 importorg.springframework.context.annotation.FilterType;9 importorg.springframework.stereotype.Controller;10

11 @Configuration12 @ComponentScan(value="com.enjoy.cap2", includeFilters ={13

14 @ComponentScan.Filter(type= FilterType.ANNOTATION, classes={Controller.class})15

16 }, useDefaultFilters = false) //扫描组建

17

18 /**

19 * value 包的地址20 * includeFilters 声明组件的作用范围21 * useDefaultFilters 不按照默认的情况22 **/

23

24 public classCap2MainConfig {25 @Bean26 publicPerson person01(){27 return new Person("jamees", 20);28 }29 }

org.springframework.context.annotation.internalConfigurationAnnotationProcessor

org.springframework.context.annotation.internalAutowiredAnnotationProcessor

org.springframework.context.event.internalEventListenerProcessor

org.springframework.context.event.internalEventListenerFactory

cap2MainConfig

orderConteroller

person01

1 packagecom.enjoy.cap2.config;2

3

4 importcom.enjoy.cap1.Person;5 importcom.enjoy.cap2.controller.OrderConteroller;6 importorg.springframework.context.annotation.Bean;7 importorg.springframework.context.annotation.ComponentScan;8 importorg.springframework.context.annotation.Configuration;9 importorg.springframework.context.annotation.FilterType;10

11

12 @Configuration13 @ComponentScan(value="com.enjoy.cap2", includeFilters ={14

15 @ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE, classes={OrderConteroller.class})16

17 }, useDefaultFilters = false) //扫描组建

18

19 /**

20 * value 包的地址21 * includeFilters 声明组件的作用范围 ANNOTATION 注解类型22 * useDefaultFilters 不按照默认的情况 ture 加载默认配置23 **/

24

25 public classCap2MainConfig {26 @Bean27 publicPerson person01(){28 return new Person("jamees", 20);29 }30 }

将自定义的信息,加入到扫描里面

方便配置和业务相关的信息,而不是将所有的信息都录入、加载配置。

1 packagecom.enjoy.cap2.config;2

3

4 importcom.enjoy.cap1.Person;5 importorg.springframework.context.annotation.Bean;6 importorg.springframework.context.annotation.ComponentScan;7 importorg.springframework.context.annotation.Configuration;8 importorg.springframework.context.annotation.FilterType;9

10

11 @Configuration12 @ComponentScan(value="com.enjoy.cap2", includeFilters ={13

14 @ComponentScan.Filter(type= FilterType.CUSTOM, classes={JamesTypeFilter.class})15

16 }, useDefaultFilters = false) //扫描组建

17

18 /**

19 * value 包的地址20 * includeFilters 声明组件的作用范围 ANNOTATION 注解类型21 * useDefaultFilters 不按照默认的情况 ture 加载默认配置22 **/

23

24 public classCap2MainConfig {25 @Bean26 publicPerson person01(){27 return new Person("jamees", 20);28 }29 }

1 /***2 * 自定义的信息3 */

4

5 packagecom.enjoy.cap2.config;6

7 importorg.springframework.core.io.Resource;8 importorg.springframework.core.type.AnnotationMetadata;9 importorg.springframework.core.type.ClassMetadata;10 importorg.springframework.core.type.classreading.MetadataReader;11 importorg.springframework.core.type.classreading.MetadataReaderFactory;12 importorg.springframework.core.type.filter.TypeFilter;13

14 importjava.io.IOException;15

16 public class JamesTypeFilter implementsTypeFilter {17 privateClassMetadata classMetadata;18

19

20 /**

21 * MetadataReader : 拿到元数据 读取到当前正在扫描类的信息22 * MetadataReaderFactory : 可以获取到其他任何类的信息23 */

24

25 public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throwsIOException {26 //虎丘当前注解的信息

27 AnnotationMetadata annotationMetadata =metadataReader.getAnnotationMetadata();28 //获取当前正在扫描的类信息

29 classMetadata =metadataReader.getClassMetadata();30 //获取当前资源(类的路径)

31 Resource resource =metadataReader.getResource();32

33 String className =classMetadata.getClassName();34 System.out.println("---->"+className);35

36 //自定义注解 信息 Config默认加载进来

37 if(className.contains("er")){ //当类包含er字符,则匹配成功,返回true

38 return true;39 }40

41 return false;42 }43 }

1 importcom.enjoy.cap2.config.Cap2MainConfig;2 importorg.junit.Test;3 importorg.springframework.context.annotation.AnnotationConfigApplicationContext;4

5 public classCap2Test {6

7 @Test8 public voidtest01(){9 AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Cap2MainConfig.class);10 //相关东西加载到容器中

11

12 String[] names =app.getBeanDefinitionNames();13

14 for(String name:names){15 System.out.println(name);16 }17 }18 }

结果:

1 ---->com.enjoy.cap2.config.JamesTypeFilter2 ---->com.enjoy.cap2.controller.OrderConteroller3 ---->com.enjoy.cap2.dao.OrderDao4 ---->com.enjoy.cap2.service.OrderService5 org.springframework.context.annotation.internalConfigurationAnnotationProcessor6 org.springframework.context.annotation.internalAutowiredAnnotationProcessor7 org.springframework.context.event.internalEventListenerProcessor8 org.springframework.context.event.internalEventListenerFactory9 cap2MainConfig10 jamesTypeFilter11 orderConteroller12 orderDao13 orderService14 person01

其中

@ComponentScan(value="com.enjoy.cap2", includeFilters ={

@ComponentScan.Filter(type= FilterType.CUSTOM, classes={JamesTypeFilter.class})

}, useDefaultFilters = false) // 扫描组建

可以多次叠加

@Scope 扫描规则

spring默认是单实例还是多实例的

在使用的时候才会创建bean

IOC容器:

多实例:仅当bean被使用的时候才创建

单实例:创阿金IOC容器的时候实例bean就被创建

1 importcom.enjoy.cap3.config.Cap3MainConfig;2 importorg.junit.Test;3 importorg.springframework.context.annotation.AnnotationConfigApplicationContext;4

5 public classCap3Test {6

7 @Test8 public voidtest01(){9 //创建容器将bean加载进来

10 AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Cap3MainConfig.class);11 //相关东西加载到容器中

12

13 String[] names =app.getBeanDefinitionNames();14

15 for(String name:names){16 System.out.println(name);17 }18

19 //从容器中分别取两次person实例,看是否为同一个bean

20 Object bean1 = app.getBean("person");21 Object bean2 = app.getBean("person");22

23 System.out.println(bean1 ==bean2);24 //结论:bean1就是bean2,是同一个对象

25 }26 }

1 packagecom.enjoy.cap3.config;2

3

4 importcom.enjoy.cap1.Person;5 importorg.springframework.context.annotation.Bean;6 importorg.springframework.context.annotation.Configuration;7 importorg.springframework.context.annotation.Scope;8

9

10 @Configuration11 public classCap3MainConfig {12 /***13 * prototypr:多实例 IOC容器启动的时候,IOC容器启动并不会调用方法创建对象,而是每次获取的时候才会调用方法创建爱你对象14 * singleton:单实例(默认):IOC容器启动的时候回调用方法创建对象并放到IOC容器中,以后灭磁回去的是就是直接从容器中拿(大Map.get)到同一个bean15 * request:主要针对一web应用,递交一次请求创建一个实例16 * session:同一个session创建一个实例17 */

18

19 @Scope("prototype")20

21 //给容器中注册一个bean,类型为返回值的类型,默认是单实例

22 @Bean23 publicPerson person(){24 return new Person("james", 20);25 }26 }

@lazy懒加载

1 packagecom.enjoy.cap4.config;2

3

4 importcom.enjoy.cap1.Person;5 importorg.springframework.context.annotation.Bean;6 importorg.springframework.context.annotation.Configuration;7 importorg.springframework.context.annotation.Lazy;8

9

10

11 @Configuration12 public classCap4MainConfig {13 /***14 * 懒加载:主要针对单实例bean:默认在容器启动的时候创建对象15 * 懒加载:容器启动时候不创建对象,一个延时等待的作用,仅当第一次使用(获取)bean的时候才创建初始化16 */

17

18 @Lazy19 @Bean20 publicPerson person(){21 System.out.println("给容器中添加person....");22 return new Person("james", 20);23 }24 }

1 importcom.enjoy.cap4.config.Cap4MainConfig;2 importorg.junit.Test;3 importorg.springframework.context.annotation.AnnotationConfigApplicationContext;4

5 public classCap4Test {6

7 @Test8 public voidtest01(){9 //创建容器将bean加载进来

10 AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Cap4MainConfig.class);11 //相关东西加载到容器中

12

13

14 System.out.println("IOC容器创建完成........");15 Object bean1 = app.getBean("person"); //执行获取的时候才创建并初始化bean

16 System.out.println(bean1);17 }18 }

很大容器就是个大map.get()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值