Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >浅析spring——IOC 之 分析 bean 的生命周期

浅析spring——IOC 之 分析 bean 的生命周期

原创
作者头像
苏先生
修改于 2019-04-29 02:03:32
修改于 2019-04-29 02:03:32
63500
代码可运行
举报
文章被收录于专栏:Java架构-筑基Java架构-筑基
运行总次数:0
代码可运行

在分析 Spring Bean 实例化过程中提到 Spring 并不是一启动容器就开启 bean 的实例化进程,只有当客户端通过显示或者隐式的方式调用 BeanFactory 的 getBean() 方法来请求某个实例对象的时候,它才会触发相应 bean 的实例化进程,当然也可以选择直接使用 ApplicationContext 容器,因为该容器启动的时候会立刻调用注册到该容器所有 bean 定义的实例化方法。当然对于 BeanFactory 容器而言并不是所有的 getBean() 方法都会触发实例化进程,比如 signleton 类型的 bean,该类型的 bean 只会在第一次调用 getBean() 的时候才会触发,而后续的调用则会直接返回容器缓存中的实例对象。

getBean() 只是 bean 实例化进程的入口,真正的实现逻辑其实是在 AbstractAutowireCapableBeanFactory 的 doCreateBean() 实现,实例化过程如下图:

原来我们采用 new 的方式创建一个对象,用完该对象在其脱离作用域后就会被回收,对于后续操作我们无权也没法干涉,但是采用 Spring 容器后,我们完全摆脱了这种命运,Spring 容器将会对其所有管理的 Bean 对象全部给予一个统一的生命周期管理,同时在这个阶段我们也可以对其进行干涉(比如对 bean 进行增强处理,对 bean 进行篡改),如上图。

bean 实例化


在 doCreateBean() 中首先进行 bean 实例化工作,主要由 createBeanInstance() 实现,该方法返回一个 BeanWrapper 对象。BeanWrapper 对象是 Spring 的一个低级 Bean 基础结构的核心接口,为什么说是低级呢?因为这个时候的 Bean 还不能够被我们使用,连最基本的属性都没有设置。而且在我们实际开发过程中一般都不会直接使用该类,而是通过 BeanFactory 隐式使用。

BeanWrapper 接口有一个默认实现类 BeanWrapperImpl,其主要作用是对 Bean 进行“包裹”,然后对这个包裹的 bean 进行操作,比如后续注入 bean 属性。

在实例化 bean 过程中,Spring 采用“策略模式”来决定采用哪种方式来实例化 bean,一般有反射和 CGLIB 动态字节码两种方式。

InstantiationStrategy 定义了 Bean 实例化策略的抽象接口,其子类 SimpleInstantiationStrategy 提供了基于反射来实例化对象的功能,但是不支持方法注入方式的对象实例化。CglibSubclassingInstantiationStrategy 继承 SimpleInstantiationStrategy,他除了拥有父类以反射实例化对象的功能外,还提供了通过 CGLIB 的动态字节码的功能进而支持方法注入所需的对象实例化需求。默认情况下,Spring 采用 CglibSubclassingInstantiationStrategy。

激活 Aware


当 Spring 完成 bean 对象实例化并且设置完相关属性和依赖后,则会开始 bean 的初始化进程(initializeBean()),初始化第一个阶段是检查当前 bean 对象是否实现了一系列以 Aware 结尾的的接口。

Aware 接口为 Spring 容器的核心接口,是一个具有标识作用的超级接口,实现了该接口的 bean 是具有被 Spring 容器通知的能力,通知的方式是采用回调的方式。

在初始化阶段主要是感知 BeanNameAware、BeanClassLoaderAware、BeanFactoryAware :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void invokeAwareMethods(final String beanName, final Object bean) {
    if (bean instanceof Aware) {
        if (bean instanceof BeanNameAware) {
            ((BeanNameAware) bean).setBeanName(beanName);
        }
        if (bean instanceof BeanClassLoaderAware) {
            ClassLoader bcl = getBeanClassLoader();
            if (bcl != null) {
                ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
            }
        }
        if (bean instanceof BeanFactoryAware) {
            ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
        }
    }
}

BeanNameAware:对该 bean 对象定义的 beanName 设置到当前对象实例中 BeanClassLoaderAware:将当前 bean 对象相应的 ClassLoader 注入到当前对象实例中 BeanFactoryAware:BeanFactory 容器会将自身注入到当前对象实例中,这样当前对象就会拥有一个 BeanFactory 容器的引用。 当然,Spring 不仅仅只是提供了上面三个 Aware 接口,而是一系列:

  • LoadTimeWeaverAware:加载Spring Bean时织入第三方模块,如AspectJ
  • BootstrapContextAware:资源适配器BootstrapContext,如JCA,CCI
  • ResourceLoaderAware:底层访问资源的加载器
  • PortletConfigAware:PortletConfig
  • PortletContextAware:PortletContext
  • ServletConfigAware:ServletConfig
  • ServletContextAware:ServletContext
  • MessageSourceAware:国际化
  • ApplicationEventPublisherAware:应用事件
  • NotificationPublisherAware:JMX通知

BeanPostProcessor


初始化第二个阶段则是 BeanPostProcessor 增强处理,在该阶段 BeanPostProcessor 会处理当前容器内所有符合条件的实例化后的 bean 对象。它主要是对 Spring 容器提供的 bean 实例对象进行有效的扩展,允许 Spring 在初始化 bean 阶段对其进行定制化修改,如处理标记接口或者为其提供代理实现。

BeanPostProcessor 接口提供了两个方法,在不同的时机执行,分别对应上图的前置处理和后置处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface BeanPostProcessor {
    @Nullable
     default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
    @Nullable
     default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

InitializingBean 和 init-method


InitializingBean 是一个接口,它为 Spring Bean 的初始化提供了一种方式,它有一个 afterPropertiesSet() 方法,在 bean 的初始化进程中会判断当前 bean 是否实现了 InitializingBean,如果实现了则调用 afterPropertiesSet() 进行初始化工作。然后再检查是否也指定了 init-method(),如果指定了则通过反射机制调用指定的 init-method()。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
   throws Throwable {
    Boolean isInitializingBean = (bean instanceof InitializingBean);
    if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
        if (logger.isDebugEnabled()) {
            logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
        }
        if (System.getSecurityManager() != null) {
            try {
                AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
                    ((InitializingBean) bean).afterPropertiesSet();
                    return null;
                }
                , getAccessControlContext());
            }
            catch (PrivilegedActionException pae) {
                throw pae.getException();
            }
        } else {
            ((InitializingBean) bean).afterPropertiesSet();
        }
    }
    if (mbd != null && bean.getClass() != NullBean.class) {
        String initMethodName = mbd.getInitMethodName();
        if (StringUtils.hasLength(initMethodName) &&
             !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
             !mbd.isExternallyManagedInitMethod(initMethodName)) {
            invokeCustomInitMethod(beanName, bean, mbd);
        }
    }
}

对于 Spring 而言,虽然上面两种方式都可以实现初始化定制化,但是更加推崇 init-method 方式,因为对于 InitializingBean 接口而言,他需要 bean 去实现接口,这样就会污染我们的应用程序,显得 Spring 具有一定的侵入性。但是由于 init-method 是采用反射的方式,所以执行效率上相对于 InitializingBean 接口回调的方式可能会低一些。

DisposableBean 和 destroy-method


与 InitializingBean 和 init-method 用于对象的自定义初始化工作相似,DisposableBean和 destroy-method 则用于对象的自定义销毁工作。

当一个 bean 对象经历了实例化、设置属性、初始化阶段,那么该 bean 对象就可以供容器使用了(调用的过程)。当完成调用后,如果是 singleton 类型的 bean ,则会看当前 bean 是否应实现了 DisposableBean 接口或者配置了 destroy-method 属性,如果是的话,则会为该实例注册一个用于对象销毁的回调方法,便于在这些 singleton 类型的 bean 对象销毁之前执行销毁逻辑。

但是,并不是对象完成调用后就会立刻执行销毁方法,因为这个时候 Spring 容器还处于运行阶段,只有当 Spring 容器关闭的时候才会去调用。但是, Spring 容器不会这么聪明会自动去调用这些销毁方法,而是需要我们主动去告知 Spring 容器。

  • 对于 BeanFactory 容器而言,我们需要主动调用 destroySingletons() 通知 BeanFactory 容器去执行相应的销毁方法。
  • 对于 ApplicationContext 容器而言调用 registerShutdownHook() 方法。

实践验证


下面用一个实例来真实看看看上面执行的逻辑,毕竟理论是不能缺少实践的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class lifeCycleBean implements BeanNameAware,BeanFactoryAware,BeanClassLoaderAware,BeanPostProcessor,
        InitializingBean,DisposableBean {

    private String test;

    public String getTest() {
        return test;
    }

    public void setTest(String test) {
        System.out.println("属性注入....");
        this.test = test;
    }

    public lifeCycleBean(){
        System.out.println("构造函数调用...");
    }

    public void display(){
        System.out.println("方法调用...");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("BeanFactoryAware 被调用...");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("BeanNameAware 被调用...");
    }

    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("BeanClassLoaderAware 被调用...");
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor postProcessBeforeInitialization 被调用...");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor postProcessAfterInitialization 被调用...");
        return bean;
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean destroy 被调动...");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean afterPropertiesSet 被调动...");
    }

    public void initMethod(){
        System.out.println("init-method 被调用...");
    }

    public void destroyMethdo(){
        System.out.println("destroy-method 被调用...");
    }

}

lifeCycleBean 继承了 BeanNameAware , BeanFactoryAware , BeanClassLoaderAware , BeanPostProcessor , InitializingBean , DisposableBean 六个接口,同时定义了一个 test 属性用于验证属性注入和提供一个 display() 用于模拟调用。 配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="lifeCycle" class="org.springframework.core.test.lifeCycleBean"
        init-method="initMethod" destroy-method="destroyMethdo">
    <property name="test" value="test"/>
</bean>

配置 init-method 和 destroy-method。测试方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// BeanFactory 容器一定要调用该方法进行 BeanPostProcessor 注册
factory.addBeanPostProcessor(new lifeCycleBean());

lifeCycleBean lifeCycleBean = (lifeCycleBean) factory.getBean("lifeCycle");
lifeCycleBean.display();

System.out.println("方法调用完成,容器开始关闭....");
// 关闭容器
factory.destroySingletons();

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
构造函数调用...
构造函数调用...
属性注入....
BeanNameAware 被调用...
BeanClassLoaderAware 被调用...
BeanFactoryAware 被调用...
BeanPostProcessor postProcessBeforeInitialization 被调用...
InitializingBean afterPropertiesSet 被调动...
init-method 被调用...
BeanPostProcessor postProcessAfterInitialization 被调用...
方法调用...
方法调用完成,容器开始关闭....
DisposableBean destroy 被调动...
destroy-method 被调用...

有两个构造函数调用是因为要注入一个 BeanPostProcessor(你也可以另外提供一个 BeanPostProcessor 实例)。

根据执行的结果已经上面的分析,我们就可以对 Spring Bean 的声明周期过程如下(方法级别)

  • Spring 容器根据实例化策略对 Bean 进行实例化。
  • 实例化完成后,如果该 bean 设置了一些属性的话,则利用 set 方法设置一些属性。
  • 如果该 Bean 实现了 BeanNameAware 接口,则调用 setBeanName() 方法。
  • 如果该 bean 实现了 BeanClassLoaderAware 接口,则调用 setBeanClassLoader() 方法。
  • 如果该 bean 实现了 BeanFactoryAware接口,则调用 setBeanFactory() 方法。
  • 如果该容器注册了 BeanPostProcessor,则会调用postProcessBeforeInitialization() 方法完成 bean 前置处理
  • 如果该 bean 实现了 InitializingBean 接口,则调用 。afterPropertiesSet() 方法。
  • 如果该 bean 配置了 init-method 方法,则调用 init-method 指定的方法。
  • 初始化完成后,如果该容器注册了 BeanPostProcessor 则会调用 postProcessAfterInitialization() 方法完成 bean 的后置处理。
  • 对象完成初始化,开始方法调用。
  • 在容器进行关闭之前,如果该 bean 实现了 DisposableBean 接口,则调用 destroy() 方法。
  • 在容器进行关闭之前,如果该 bean 配置了 destroy-mehod,则调用其指定的方法。
  • 到这里一个 bean 也就完成了它的一生。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
QQ AI画画|探索机器创造力
前言: 当我们谈论画作,会醉心于印象派光影斑斓的色彩,会惊叹于国风文人画如诗如歌的构图,会震撼于画师笔下一个又一个充满想象力和创造力的世界;而当我们提及AI,脑海中浮现的是前沿深奥的大数据云计算,是冰冷严谨的逻辑思维能力。两者碰撞交织,让AI学会“通感”,AI画手们带着惊人的机器想象力和极具冲击力的刻画刷新着我们的感官体验。与此同时居高不下的热点讨论也一遍遍提出质疑:AI让艺术沦为了单纯的数据游戏,使绘画失去了灵魂。那么如何为AI创造力赋能,将其转化为视觉传达的生产力,成为设计师探索的新方向。 AI画画结
腾讯ISUX
2023/02/13
1.3K0
QQ AI画画|探索机器创造力
狂徒AI对罗翔老师下手了
金磊 发自 凹非寺 量子位 | 公众号 QbitAI 朋友,有没有想过自己在二次元里长什么样? 最近就有这么样的一个生成器在国内外火了。 瞧,输一张罗翔老师的照片,“啪的一下”就能生成二次元漫画风: 一键秒变霸道总裁有木有,引得网友纷纷前来围观。 甚至就连KFC(肯德基)官方账号都来凑起了热闹,亲自打破自家老爷子的次元壁: 各类梗图更是层出不穷: 在二次元滤镜下,就连这张经典的“女人吼猫”都透露出一丝温馨,“竟然都有点可爱了呢”。 这就是QQ小世界在近期推出的二次元形象生成器——“异次元的我”。 那么
量子位
2023/02/28
3020
狂徒AI对罗翔老师下手了
我迟早被这些AI绘画笑死
詹士 发自 凹非寺 量子位 | 公众号 QbitAI AI绘画,你没事吧? 狗主人直接变身狗爸爸,被顶上APP首页: 纯欲风女孩变成了纯欲风猴子…… 下方网友评价「当真是二次猿模型」: 甚至,还有结婚照男主角变成墙上大头贴,配着粉色花瓣,画风十分阴间…… 这些例子来自各平台用户们的分享,这两天,又掀起一波「AI绘画离谱作品」的讨论。 抖音热榜上,该话题流量超660万,阿根廷足球队也甘拜下风。 连无穷小亮也在网上吐槽「AI智障绘画」,引来大批围观: 离谱的AI绘画背后,是时下AIGC门槛一再降低,近
量子位
2023/02/28
1.2K0
我迟早被这些AI绘画笑死
QQ动漫丨高效与趣味的有机融合
项目背景 随着网络的持续提速和优质国漫的不断兴起,动漫在年轻人的生活中,已经成为了他们日常不可或缺的一部分。为了更好地为QQ当中的海量年轻用户提供服务,我们也想借着产品这次想更纯粹化的契机,对QQ动漫的品牌和体验进行一次全面的升级改造。 PART1 目标定义 通过前期的分析体验,我们梳理出目前产品存在的一些核心问题。 而从用研和报告发现,我们的目标用户主要是小学高年级以及初高中生。从调研中我们了解到他们日常使用的上网设备主要是以中低端机型为主,而用于娱乐消费的时间一般也是比较有限且固定的,所以
腾讯ISUX
2021/05/14
6300
DNSPod十问周艺超:AI如何成为当代毕加索?
本期嘉宾 周艺超 腾讯QQ影像中心工程师 周艺超,腾讯QQ影像中心资深应用开发工程师。入职腾讯后负责超级QQ秀的智能捏脸相关的研发工作,2022年开始负责小世界AIGC相关的技术研发和产品落地,主要负责《异次元的我》、《魔法画室》等活动的算法开发、工具架构搭建、AI应用落地等相关工作。加入腾讯前从事虚拟人生成、人脸编辑等领域相关研究。 主持人 田超 腾讯云企业中心总经理 田超,腾讯云企业中心总经理、音视频应用平台总经理,负责腾讯云用户增长、DNSPod业务以及企业应用相关产品。同时也是资深用户增长专
腾讯云DNSPod团队
2023/04/23
7490
DNSPod十问周艺超:AI如何成为当代毕加索?
AI+漫画生产 小冰、百度们的新商机?
近年,由于网络的普及,动漫作品传播的速度不断加快,二次元文化的受众数量不断上升,影响范围也越来越广泛。
用户2908108
2021/04/26
9090
AI+漫画生产 小冰、百度们的新商机?
理所当燃 | 打造会员20周年超燃盛典
项目背景 2000年QQ会员诞生,不断探索如何带给用户更好的增值服务,正值20周年的时间节点,QQ会员推出20周年系列庆典活动,携手靓号、会员游戏、个性化装扮、QQ音乐、bilibili等多个分会场,通过多种好礼折扣、豪华大礼包等联合回馈用户,和广大QQ用户一起携手为QQ会员20周年庆生。 整个项目主要从以下六个部分进行规划:概念脑暴、品牌重塑、主活动(portal聚合、QQ能量值等)、设计衍生、外部联动、庆典宣传等。通过系统有节奏的整体规划,设计团队一步一步建立会员20周年品牌,体系化的构建以“渠
腾讯ISUX
2021/05/26
1.4K0
刷屏朋友圈的QQ小世界二次元生成器原理解密
作者:yichaozhou,腾讯 PCG 应用研究员 只需要上传一张照片,一键即可穿越二次元。火遍国内外的 QQ 小世界二次元生成器——“异次元的我“背后原理解密。 1 项目介绍 今年是人工智能领域成果井喷的一年,前有 AI 画画后有 chatGPT,纷纷迅速走红网络。早在今年五月,QQ 影像中心推出的国内第一款基于 AI 画画技术的”AI 恋爱专属画”520 活动就在小世界走红,最近新推出的“异次元的我”二次元形象生成器更是火遍国内外。 你可以看到罗翔老师一键变身霸道总裁: 甚至能看到 KFC 官推亲自
腾讯技术工程官方号
2022/12/26
1.2K0
刷屏朋友圈的QQ小世界二次元生成器原理解密
2022年全网最全AI绘画产品整理(一共23款,免费的绘画次数用到你手软)
完全够普通人到日常绘画需求;如果你有大量的绘画需求(月绘画次数过万),欢迎联系(关注公众号:飞链云3D数字生态),提供专门的开放平台API接口对接,基于我们研发能力和算法的提升,我们价格可低至6分一次(市场价格通常在1毛-2毛不等);专业阿里系研发团队,日承载绘画次数可达百万次;
谙忆
2023/01/30
3.6K0
邂逅二次元爱豆 | 波洞星战设定
腾讯ISUX isux.tencent.com 社交用户体验设计 导语 在ACG圈有着这样一种赛事:没有硝烟战火,没有(广义上的)明星参与,没有盛大线下比拼,却能引发广大粉丝疯狂参与,甚至爆肝应援——这就是「萌战」,属于二次元粉丝和人气动漫角色的评选大战。此类活动鼻祖是「日萌」,起源于日本最大的论坛2ch,从02年开始流传至今,由网站居民自发举行,选出年度二次元er最爱的人气角色。因赛制问题和不接受非本国人员投票等原因慢慢失去关注,而后「世萌」、「燃战」以及国内的「B萌」「部落萌」等等
腾讯ISUX
2019/10/10
6870
邂逅二次元爱豆 | 波洞星战设定
微视品牌体验设计
腾讯ISUX isux.tencent.com 社交用户体验设计 项目背景 2017年是整个短视频大爆发的时期,内容产业逐渐成为移动互联网新的生力军。短视频产品同质化,用户体验趋同,团队希望运用品牌体验的全局设计思维,从视觉识别,用户体验,线上线下推广及产品礼品等多个维度来凸显产品核心价值,搭建一套完整统一的产品设计语言。 目标 微视目标很清晰,需要在短时间内快速进入短视频第一集团,切入短视频社交领域,挖掘更多机会点,也希望借这个机会能成为像微信这样的腾讯战略级产品。 设计挑战 设计的挑战
腾讯ISUX
2018/10/17
1.3K0
微视品牌体验设计
韩国最新「美女元宇宙」引爆Reddit!最强换脸神器美女自拍一键转漫画
最近,韩国最大的漫画平台网站Naver webtoon(네이버만화)推出了一个新工具WebtoonMe,可以将自拍照或者视频转换为韩式网络漫画的风格。
新智元
2022/02/24
1.5K0
韩国最新「美女元宇宙」引爆Reddit!最强换脸神器美女自拍一键转漫画
VIP品牌升级 | 打造有温度的二次元形象
一、项目背景 随着80、90、00后陆续成为互联网社交的主力群体,泛二次元文化从以前的小众圈层,逐渐发展壮大,与主流文化接轨。据多个专业数据分析机构的报告显示,国内泛二次元用户规模已达3亿+人。为了精准触达用户,黄钻、QQ会员以及QQ大会员陆续推出了全新的二次元IP,并在系列营销活动中崭露头角。 二、策略定位 综合考虑品牌调性和营销策略,三大品牌的新形象定位为“二次元Q版拟人”风格。 我们的用户群与泛二次元用户有很大交集,二次元风格正好适配我们目标人群的兴趣点,有助于提升三大品牌在目标群体间的好
腾讯ISUX
2021/12/07
8790
ISUX「七月」行业设计趋势速递
本期摘要: (1)Facebook 开始在美测试NFT功能(2)Facebook Groups 引入频道功能 (3)Niantic 正式推出社交应用 Campfire(4)twitter 内测多人共同编辑一条tweet的能力(5)Instagram Reels 短视频功能更新(6)QQ音乐打造音乐版社交元宇宙(7)Meta Horizon Home 让 VR 更具社交性(8)抖音上线桌面端(9)“中文梗博物馆”出现在 VR 世界(10)#Me:现实社交带进异世界的虚拟游戏(11)上大元宇宙:现实校园搬上虚拟
腾讯ISUX
2022/08/26
9480
ISUX「七月」行业设计趋势速递
AI绘画社区:解锁艺术共创的无限可能(9/10)
在科技飞速发展的今天,AI 绘画早已不再仅仅是一项孤立的技术,它正以惊人的速度融入我们的社交生活,成为艺术爱好者们交流互动的全新方式,构建起一个充满活力与创意的社交生态。
正在走向自律
2025/02/09
2150
AI绘画社区:解锁艺术共创的无限可能(9/10)
原来最强赘婿在二次元长这样,秒穿次元壁的AI特效又双叒火了
虽然每天早晨甚至无法从50平米的地铺上醒来,但偶尔刷刷知乎,还是会被这类问题吸引住眼球——
量子位
2020/09/30
4910
原来最强赘婿在二次元长这样,秒穿次元壁的AI特效又双叒火了
QTX看点 | 企鹅巨械QQ MAX BOT横空出世!
Pat Lee专访 在Marvel或DC漫画改编的电影里,总有类似的场景:一个看似路人般的男子,他们或借助神力、或借助科技,最后拥有强大的力量。 最终惩恶扬善,拯救世界。 超级英雄电影之所以风靡世界,究其原因——是大部分普通人心中,都有一个拯救世界的梦想。超级英雄让普通人的梦想实现在虚拟的电影世界里。 最近,激萌可爱的QQ就试着拯救了一次世界。人们眼中一直萌哒哒的QQ,其实也可以充满战斗力! 还有个惊喜哟!这款企鹅巨械的潮玩将在QQ潮玩展预售,同款3米的巨型雕塑也将同时亮相!真的别错过!感兴趣的
腾讯ISUX
2020/08/26
1.4K0
AI绘画进阶指南:突破参数与模型的次元壁(8/10)
在 AI 绘画的奇妙世界里,许多人最初被其神奇效果吸引,凭借简单指令就能生成有趣图像,从而踏入这片充满创意的领域。从最初惊叹于 AI 绘画工具能将简单的文字描述转化为一幅幅精美的图像,到逐渐不满足于基础操作,想要突破瓶颈,从新手成长为高手,这中间的进阶之路充满了挑战与惊喜。
正在走向自律
2025/02/09
2680
AI绘画进阶指南:突破参数与模型的次元壁(8/10)
开源神器:想秒变二次元?行,满足你!
当然,如果你有喜欢的二次元老婆,想看她穿越到现实会是什么样子,也没有问题。只要输入一张她的头像:
GitHubDaily
2019/11/06
1.4K0
开源神器:想秒变二次元?行,满足你!
【犀牛鸟·视野】SIGGRAPH ASIA 2018:腾讯“AI画师YUI”的背后技术
导语 腾讯AI Lab在SIGGRAPH ASIA 2018上展出了自主研发的“AI画师YUI”demo。访客可以直接用手机拍摄一张自己的照片,然后利用AI画师YUI的微信小程序自动将真人头像转换成萌萌的日系二次元头像。转换结果可以现场打印成照片,供访客带回家留念。很多访客都亲身试用了该功能,表示非常有趣,期待着未来的正式上线。 图1 SIGGRAPH AISA上现场展示AI画师YUI YUI 的日文假名写法为“ゆい”,对应汉字为“結”(简体中文:结),其意思即“连结”。其名字的寓意是希望 Y
腾讯高校合作
2018/12/19
1.3K0
【犀牛鸟·视野】SIGGRAPH ASIA 2018:腾讯“AI画师YUI”的背后技术
推荐阅读
相关推荐
QQ AI画画|探索机器创造力
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验