1.spring bean注解1

目录

[TOC]

1.spring IOC 容器获取

底层是一个map,bean的注册、实例化、管理

1).ClassPathXmlApplicationContext

代码演示

2).AnnotationConfigApplicationContext

代码演示

a.@Configuration

spring3.0声明配置类,取代applicationContext.xml 配置文件

b.@Bean

将对象注入到spring中,bean的id默认取方法名

1).@Lazy

懒人式加载,需要的时候才会初始化

2). @Scope

设置bean的作用域
bean作用 默认singleton,其它为prototype,request,session,application,GlobalSession

c.@ComponentScan

组件扫描,

  • 可以指定范围,value指定哪个包下
  • 扫描过滤
  • 自定义过滤
d.@Component

@Component组件\left\{ \begin{aligned} @Repository& 持久化层 \\ @Service& 业务层\\ @Controller& 控制层 \\ \end{aligned} \right.
都是声明为bean,其实三个注解类上多有@Component,相当于其子类

e.@Conditional

与@Bean连用,满足特定的条件,该bean才会被注入
代码演示

f.@Import

也是往容器中注入bean,默认全类名(bean的id)

  • 直接指定value穿bean的类

  • 实现ImportSelector接口,返回全类名数组

  • 实现 ImportBeanDefinitionRegistrar接口
    代码演示

g.FactoryBean接口

也是将该类注入到容器中
代码演示

7.@Qualifier @PriMary

都是用于bean的注入,@Qualifier根据id查找bean,@PriMary,注入是优先注入被该注解修饰的

代码演示

1.ClassPathXmlApplicationContext

1.实体类

/**
 * @author summit
 * @since 2019/9/23 22:34
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {

    private int id;

    private String name;
}

2.bean.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans   xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="user"  class="cn.summit.entity.User">
        <property name="id" value="1"/>
        <property name="name" value="summit"/>
    </bean>
</beans>

3.测试类

    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        User user = (User)applicationContext.getBean("user");
        System.out.println(user);
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
    }

运行结果

User(id=1, name=summit)
user

2.AnnotationConfigApplicationContext

2.1 Configuration类
/**
 * @author summit
 * @since 2019/10/13 14:06
 */
@Configuration
//@ComponentScan(value = "cn.summit.entity.IOCget", excludeFilters = {
//        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Summit.class})
//}, useDefaultFilters = true)
@ComponentScan(value = "cn.summit.entity.IOCget", excludeFilters = {
       @ComponentScan.Filter(type = FilterType.CUSTOM, classes = {MyTypeFiler.class})
}, useDefaultFilters = true)
public class ConfigurationTest {

    @Bean
    @Lazy
    public User user() {
        System.out.println("@bean");
        return new User(2, "sky");
    }
}
2.2 MyTypeFiler
public class MyTypeFiler implements TypeFilter {

    /**
     *
     * @param metadataReader 当前扫描类型信息
     * @param metadataReaderFactory 其他任何类信息
     * @return
     * @throws IOException
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        //注解信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        //类路径
        Resource resource = metadataReader.getResource();
        System.out.println(resource.getDescription());
        //类信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        System.out.println(classMetadata.getClassName());
        return false;
    }
}
2.3 component
@Repository
public class UserDao {
}

@Service
public class UserService {
}

@Controller
@Summit
public class UserController {
}

public @interface Summit {
}
2.4 MyTypeFiler
public class MyTypeFiler implements TypeFilter {

    /**
     *
     * @param metadataReader 当前扫描类型信息
     * @param metadataReaderFactory 其他任何类信息
     * @return
     * @throws IOException
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        //注解信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        //类路径
        Resource resource = metadataReader.getResource();
        System.out.println(resource.getDescription());
        //类信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        System.out.println(classMetadata.getClassName());
        return false;
    }
}
2.5 test
/**
 * @author summit
 * @since 2019/10/13 14:04
 */
public class AnnotationConfigApplicationContextTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ConfigurationTest.class);
        System.out.println("IOC 初始化");
        User user = (User)applicationContext.getBean("user");
        Arrays.stream(applicationContext.getBeanDefinitionNames()).forEach(System.out::println);
        System.out.println(user);
    }
}
2.6 结果
file [D:\onlyoproject\mysky\enjoy-study\spring-study\target\classes\cn\summit\entity\IOCget\AnnotationConfigApplicationContextTest.class]
cn.summit.entity.IOCget.AnnotationConfigApplicationContextTest
file [D:\onlyoproject\mysky\enjoy-study\spring-study\target\classes\cn\summit\entity\IOCget\ClassPatchApplicationTest.class]
cn.summit.entity.IOCget.ClassPatchApplicationTest
file [D:\onlyoproject\mysky\enjoy-study\spring-study\target\classes\cn\summit\entity\IOCget\controller\UserController.class]
cn.summit.entity.IOCget.controller.UserController
file [D:\onlyoproject\mysky\enjoy-study\spring-study\target\classes\cn\summit\entity\IOCget\Dao\UserDao.class]
cn.summit.entity.IOCget.Dao.UserDao
file [D:\onlyoproject\mysky\enjoy-study\spring-study\target\classes\cn\summit\entity\IOCget\myannotation\Summit.class]
cn.summit.entity.IOCget.myannotation.Summit
file [D:\onlyoproject\mysky\enjoy-study\spring-study\target\classes\cn\summit\entity\IOCget\MyTypeFiler.class]
cn.summit.entity.IOCget.MyTypeFiler
file [D:\onlyoproject\mysky\enjoy-study\spring-study\target\classes\cn\summit\entity\IOCget\service\UserService.class]
cn.summit.entity.IOCget.service.UserService
IOC 初始化
@bean
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
configurationTest
userController
userDao
userService
user
User(id=2, name=sky)

3.@Conditional演示demo

3.1 配置类
@Configuration
public class TestConfig {

    @Bean("window")
    @Conditional(DevCondition.class)
    public UserBean window() {
        System.out.println("注入 window");
        return new UserBean();
    }
}
3.2 Condition类
/**
 * @author summit
 * @since 2019/9/25 21:32
 */
public class DevCondition implements Condition {

    /**
     * 开发环境使用的是 window系统
     * 实现Condition接口自定义注入条件
     *
     * @param context
     * @param metadata
     * @return
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        String property = environment.getProperty("os.name");
        System.out.println("当前操作系统"+property);
        if (property.contains("Window")) {
            return true;
        }
        return false;
    }
}
3.3 测试结果

在windows系统下注入,在linux不注入

4.@Import代码

4.1 configuation类
@Configuration
@Import(value = {MyBeanDefinitionRegist.class,T3Entity1.class,T3Entity2.class,ImportSelectorTest.class})
public class Test3Config {

    @Bean
    public MyFactoryBean myFactoryBean() {
        return new MyFactoryBean();
    }
}
4.2 ImportSelector接口实现
/**
 * @author summit
 * @since 2019/9/27 22:38
 */
public class ImportSelectorTest implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"cn.summit.entity.springconfig.Test3.E3Entity3","cn.summit.entity.springconfig.Test3.E3Entity4"};
    }
}

4.3 ImportBeanDefinitionRegistrar接口实现
public class MyBeanDefinitionRegist implements ImportBeanDefinitionRegistrar {
    /**
     * 注册bean到ioc
     *
     * @param importingClassMetadata 注解
     * @param registry 注册
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        System.out.println(Thread.currentThread().getName());
        boolean b = registry.containsBeanDefinition("cn.summit.entity.springconfig.Test3.T3Entity2");
        System.out.println(b);
        String beanname = "registerEntity-test";
        RootBeanDefinition beanDefinition = new RootBeanDefinition(RegisterEntity.class);
        registry.registerBeanDefinition(beanname,beanDefinition);

    }
}
4.4 测试
   public static void main(String[] args) {

        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Test3Config.class);
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
    }

5.FactoryBean接口代码

public class MyFactoryBean implements FactoryBean<T3Entity5> {

    @Override
    public T3Entity5 getObject() throws Exception {
        return new T3Entity5();
    }

    @Override
    public Class<?> getObjectType() {
        return T3Entity5.class;
    }
}

    @Bean
    public MyFactoryBean myFactoryBean() {
        return new MyFactoryBean();
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容