- Notifications
You must be signed in to change notification settings - Fork6
⚡简单的Java依赖注入框架,代码量少,实现了依赖注入和AOP。适合Spring源码的初学者掌握其核心原理
License
bootsrc/containerx
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
⚡一个迷你型Java依赖注入框架,代码量小,实现了依赖注入和AOP。适合Spring源码的初学者掌握核心原理。
极少使用其他的第三方jar包。
自己写一个Spring框架?博主,你在开玩笑吗?NO! 通过研究了Spring源码的核心思想,自己用写一个小框架,加载类似
的beans.xml配置,并且把bean都以单例方式注册到容器中,并且用InvocationHandler来实现AOP这个,就是核心思想
,而且具备可行性。只不过没有Spring源码那样处理其它的细枝末节。
容器的本质是什么?--ConcurrentHashMap!
key是bean的name, value就是那个单例bean。有没有感觉豁然开朗?这样可以实现带依赖注入功能的容器。
InvocationHandler,还有Proxy.newProxyInstance()... 灵光一闪,是不是有实现AOP的思路了?
- setter注入(目前基于xml配置bean,未来会支持注解配置bean);
- 单例bean的注册和获取;
- AOP面向切面编程(基于xml配置);
步骤如下:
Step 1: 在自己的项目里添加containerx的依赖
<dependency><groupId>io.github.flylib</groupId><artifactId>containerx</artifactId><version>1.0.1</version></dependency>
Step2: 在自己的项目里面执行
mvn compile
Step3: 打包自己的程序
如果需要打包成可以运行的Java Application,需要注意
pom.xml增加
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><jdk.version>1.8</jdk.version></properties><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>${jdk.version}</source><target>${jdk.version}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.6</version><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix><mainClass>io.github.flylib.containerx.demo.app.ContainerxDemoApp</mainClass></manifest></archive></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>2.10</version><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin></plugins></build>
然后执行mvn package
在target路径下生成了containerx-demo-1.0.1.jar(包含有Main-Class和Class-Path的MANIFEST.MF)以及包含有所有依赖的jar的lib文件夹
Step4.运行自己的jar包
java -jar containerx-demo-1.0.1.jar
可以参考containerx-demo项目。
containerx-demo项目 Java代码如下:
packageio.github.flylib.containerx.demo.app;importio.github.flylib.containerx.beans.factory.BeanFactory;importio.github.flylib.containerx.beans.factory.XmlBeanFactory;importio.github.flylib.containerx.demo.model.Person;importio.github.flylib.containerx.demo.service.DemoService;/** * containerx的demo * @author Frank Liu(liushaomingdev@163.com) * */publicclassMain {publicstaticvoidmain(String[]args) {iocDemo();}privatestaticvoidiocDemo() {BeanFactorybeanFactory =newXmlBeanFactory("beans.xml");Personperson = (Person)beanFactory.getBean("myPerson");System.out.println("name=" +person.getName());System.out.println("address=" +person.getAddress());Personperson1 = (Person)beanFactory.getBean("myPerson");System.out.println("person=" +person);System.out.println("person1=" +person1);System.out.println("person == person1? " + (person ==person1));aopDemo(beanFactory);}privatestaticvoidaopDemo(BeanFactorybeanFactory) {DemoServicedemoService = (DemoService)beanFactory.getBean("demoService");System.out.println("\n\n---AOP demo---");demoService.doSomething();}}
运行结果如下:
--> DefaultDocumentLoader-getAopConfig<?xml version="1.0" encoding="UTF-8"?><aop:aspect-list><aop:aspect bean="demoAspect"><before>beforeMethod</before><after>afterMethod</after></aop:aspect></aop:aspect-list>Security framework of XStream not initialized, XStream is probably vulnerable.id=aop1, bean=demoAspect, target=demoServicebefore=beforeMethod, after=afterMethod鐢ㄤ唬鐞哹ean鍘讳唬鏇縝ean瀹瑰櫒涓師鏈夌殑bean 瀹屾瘯.name=Frank Liuaddress=Shanghai,China(中国-上海)person=io.github.flylib.containerx.demo.model.Person@15ca7889person1=io.github.flylib.containerx.demo.model.Person@15ca7889person == person1? true---AOP demo------aop log- before------DemoServiceImpl.doSomething() done------aop log- after---核心方法是inject(Object bean, Map<String, Object> properties)
而其中核心的一行代码是
method.invoke(bean,methodMap.get(methodName));
- 我自己的控制台程序Java Application程序为何mvn package后提示找不到main class ?
答:在pom.xml文件中没有做项目的打包设置的时候,默认没有设置main()函数所在的class, 并且带上依赖的jar包。 对于maven的Java Application项目(控制台程序),可以字在pom.xml中增加如下设置
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.6</version><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix><mainClass>io.github.flylib.containerx.demo.app.ContainerxDemoApp</mainClass></manifest></archive></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>2.10</version><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin>
打包的时候执行
mvn package
如果您愿意捐助一下项目,可以通过微信/支付宝捐助哟~
| 微信 |
|---|
![]() |
About
⚡简单的Java依赖注入框架,代码量少,实现了依赖注入和AOP。适合Spring源码的初学者掌握其核心原理
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
