SpringBoot Bean花式注解方法示例上篇
零维展开智子 人气:01.XML方式声明
这里我举两个例子,一个是自定义的bean,另一个是第三方bean,这样会全面一些。
你还可以定义这个bean的模式,有单例模式和多例模式,prototype代表多例,singleton代表单例。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <bean class="yi.beans.Cat" id="cat" scope="prototype"/> <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource" scope="singleton"/> </beans>
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App1 { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); String[] names = context.getBeanDefinitionNames(); //获取所有的beam名字 for (String name : names) { System.out.println(name); } } }
2.注解法@Component
第一种方式配置起来太复杂了,而且也不够灵活。
同样我也会拿自定义bean和第三方bean来举例子。
import lombok.Data; import org.springframework.stereotype.Component; @Component("Tom") @Data public class Cat { }
注解法也是可以指定id的。
import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = true) //默认为true,代表从IOC容器中取对象 public class Dbconfig { @Bean public DruidDataSource source(){ DruidDataSource dataSource=new DruidDataSource(); return dataSource; } }
对于第三方bean,我们没有办法直接给其加注解,就需要用配置类来书写,其中@Configuration和@Component几乎一模一样,不过其可以通过参数来指定是否生成新的bean对象还是直接从IOC容器里面拿原先的。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="yi.beans,yi.config"/> </beans>
扫描的时候可以通过逗号来分割开多个包。
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App1 { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); String[] names = context.getBeanDefinitionNames(); //获取所有的beam名字 for (String name : names) { System.out.println(name); } } }
其中bean的name就是其id,没有的话就是它的类名或者方法名首字母小写。
中间那些我们暂时不做讨论。
Tom就是自定义的bean,dbconfig就是配置类的bean,source就是第三方bean。
3.完全注解式
第二种其实还没有完全做到全注解,其在扫描的时候还是需要书写xml,还是不够灵活。
我们需要在扫描的时候也由注解来安排。
import lombok.Data; import org.springframework.stereotype.Component; @Component("miao") @Data public class Cat { }
import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = true) //默认为true,代表从IOC容器中取对象 public class Dbconfig { @Bean public DruidDataSource source(){ DruidDataSource dataSource=new DruidDataSource(); return dataSource; } }
import org.springframework.context.annotation.ComponentScan; @ComponentScan({"yi.config","yi.beans"}) public class ZConfig { }
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App1 { public static void main(String[] args) { ApplicationContext context=new AnnotationConfigApplicationContext(ZConfig.class); String[] names = context.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); } } }
可以看到我们现在已经完全不需要xml文件了耶。
不过还有个问题,如果就是说我们想把一个比较远古的项目以前是xml配置的,现在要改为注解式怎末办呢?这里有一个注解。
可以建一个总的配置类。
import org.springframework.context.annotation.ImportResource; @ImportResource("spring-config.xml") public class ZConfig { }
小插曲-工厂式定义
这种方式可以在bean被加载前对其进行一些操作。
import lombok.Data; @Data public class Dog { }
import org.springframework.beans.factory.FactoryBean; import yi.beans.Dog; public class DogFactory implements FactoryBean<Dog> { @Override public Dog getObject() throws Exception { Dog dog=new Dog(); //可以进行一些setter操作 return dog; } @Override public Class<?> getObjectType() { return Dog.class; } @Override public boolean isSingleton() { //是否为单例模式 return true; } }
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import yi.beans.factory.DogFactory; @Configuration(proxyBeanMethods = true) //默认为true,代表从IOC容器中取对象 public class Dbconfig { @Bean public DogFactory dog(){ DogFactory dogFactory = new DogFactory(); return dogFactory; } }
这种算是比较像第三方bean的加载了,不过也不完全一样,它的bean类型不是方法的返回值类型,而是实际工厂类造出来的bean类型。因为工厂类不会自己造自己的。
import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import yi.beans.Dog; import yi.config.Dbconfig; public class App1 { public static void main(String[] args) { ApplicationContext context=new AnnotationConfigApplicationContext(Dbconfig.class); String[] names = context.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); } Dog dog = context.getBean("dog", Dog.class); System.out.println(dog.getClass()); } }
4.简化注解@Import
这种方式也是在我们读源代码是最常见的一种bean定义方式。
自定义bean,这里无需使用@Component来声明了。
import lombok.Data; @Data public class Dog { }
第三方定义的bean,我们也不需要使用@Configuration来声明了。
import org.springframework.context.annotation.Import; @Import({Dbconfig.class,Dog.class}) public class ZConfig { }
这里再导入字节码文件时没有路径,注意导包不要导错。
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App1 { public static void main(String[] args) { ApplicationContext context=new AnnotationConfigApplicationContext(ZConfig.class); String[] names = context.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); } } }
可以看到最后面的那两个就是,前两个是类对象,他们也被定义为bean加载进IOC容器了,不过一般不会使用。
加载全部内容