受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提供了一个配置框架,可以完全用于开发云应用程序。配置框架的思想是为应用程序提供一个标准接口来获取属性。
构成这个框架主干的两个类是Configuration
和ConfigurationProvider
。在应用程序启动过程中,需要使用如下所示的配置提供程序列表初始化框架
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"))