受spring启发的python框架

pspring的Python项目详细描述


pspring

这是一个轻量级框架,使python开发人员能够使用注释/装饰器快速开发应用程序。受java的spring框架启发,该框架提供ioc(控制反转)和自动连接bean的能力。

默认环境变量总是可以找到defaultvars.py文件

下面是此模块支持的注释/装饰器的索引

  • @Bean(name="")

    这个decorator将把类或方法(返回一个bean实例)注册到pspring应用程序上下文中。您可以提供一个可选的name属性来用限定名注册bean。如果不提供名称,则会为其类型(及其基类)注册bean

  • @Autowired(name=beanname)

    这个decorator听说过依赖注入,它将自动连接方法的参数(特别是在__init__构造函数中使用)。您可以提供名称-值对的列表,其中,name是方法定义中的参数名,将为其向名为beanname的bean注入该限定符。

配置框架

配置应用程序可能会使环境变量、默认变量和各种配置源(如机密、加密变量等)变得复杂。

pspring提供了一个配置框架,可以完全用于开发云应用程序。配置框架的思想是为应用程序提供一个标准接口来获取属性。

构成这个框架主干的两个类是ConfigurationConfigurationProvider。在应用程序启动过程中,需要使用如下所示的配置提供程序列表初始化框架

frompspsringimportConfiguration,ConfigurationProviderconfig={"firstname":"dave","lastname":"picaso"}# A simple dictionary based config providerclassDictionaryConfigurationProvider(ConfigurationProvider):defgetProperty(propertyName):returnconfig.get(propertyName)Configuration.initialize([DictionaryConfigurationProvider()])config=Configuration.getConfig(__name__)# will print 'dave'print(config.getProperty("firstname"))

在模块中,配置为命名空间提供了避免属性名冲突的方法。

示例:

frompspsringimportConfigurationconfig=Configuration.getConfig(__name__)print(config.getProperty("firstname"))

在上面的代码中,我们通过传入模块名(name)来创建一个configiration访问器实例。这将创建属性所在的命名空间。例如:如果文件作为com/example/application.py保存在包下,那么属性名实际上将被引用为com.example.application.firstname

调用getProperty方法时

1) the property is looked up in environment variables
2) the property is searched in the given list of ConfigurationProviders during initialization
3) the property is searched in the defaults
4) Search the property one above the hierarchy in the namespace starting from step 1. ( Eg: com.example.firstname )

继续执行上述搜索序列,直到找到属性。如果找不到属性,则返回None

pspring与pspring aws一起提供了大量可与aws一起使用的配置提供程序(secretsmgrconfigprovider、dynamodbconfigprovider、realtimesecretsmgrcconfigprovider等)。

用法

在需要任何依赖注入之前,应该初始化pspring的上下文。下面显示了一个代码示例

importsys,osfrompspringimport*config=Configuration.getConfig(__name__)@Bean(name="loggerBeanName")classLogger():def__init__():passdefsayHi(self,name):print("Hi "+str(name));classMyApp():@Autowired(mylogger="loggerBeanName")def__init__(self,mylogger:Logger):self.logger=myloggeros.environ["name"]="dave"Configuration.initialize([])ApplicationContext.initialize()app=MyApp()# prints "Hi dave"app.logger.sayHi(config.getProperty("name"))

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Maven无法识别安装在Ubuntu外壳上的$java_HOME jdk   java如何防止可运行程序在其中一个抛出异常时执行   java Listview在按下项时不触发   如何在WindowsPhone8中使用JavaRESTWebService?   java在spring引导下使用多个dispatcher servlet/web上下文   java为什么在删除容器的绝对大小时不绘制GEF子项?   java在hibernate实体中保留DB约束是好的   JavaSpring选择最高优先级bean   ArrayList<Class>java字符串[]   有向加权边图的Java邻接表实现   字母数字字符串的java Tesseract配置:混合2、Z、6和G   如果输入为空,则带有EditText的java警报对话框将关闭   jsp上的java Struts 2动作响应   java获取IndexOutOfBundException Android   scala AWSJAVASDK:解压缩大小必须小于262144000字节