当前位置: 首页 > news >正文

政府部网站建设站长统计性宝app

政府部网站建设,站长统计性宝app,湖北网站设计制作多少钱,电商网站开发岗位职责概述 对于学习Spring的兄弟姐妹来说,觉得这个问题很熟悉,若是要把它回答得很清楚,却是很为难?平时写代码的时候,不会在意这些概念问题,但面试时这个问题出现的频率却是很高,所以还是必须要掌握…

概述

对于学习Spring的兄弟姐妹来说,觉得这个问题很熟悉,若是要把它回答得很清楚,却是很为难?平时写代码的时候,不会在意这些概念问题,但面试时这个问题出现的频率却是很高,所以还是必须要掌握和理解。

Spring Bean定义有哪些方式?

总的来说,分三种:
1)基于xml的方式
2)基于注解的方式
3)基于java类的方式

1、基于xml的方式

XML配置的方式,是Spring最早支持的方式,不过现在XML方式已经用的比较少了,基本上都是用后面的配置方式替代了。

示例:

@Data
@ToString
public class Student {String name;int age;
}
<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.xsd"><bean id="student" class="com.koo.entity.Student"/>
</beans>
public class Client {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-config.xml");System.out.println(applicationContext.getBean("student"));}
}

2、基于注解的方式

又分一下几种方式
1) 使用@Component注解 + @ComponentScan包扫描方式
2)@Configuration + @Bean方式
3)FactoryBean方式
4)@Import方式
5)@Import + ImportSelector方式
6)@Import + ImportBeanDefinitionRegistrar方式
7)BeanDefinitionRegistryPostProcessor方式
8)BeanFactoryPostProcessor方式

1) 使用@Component注解 + @ComponentScan包扫描方式

为了解决bean太多时,XML文件过大,从而导致膨胀不好维护的问题。在Spring2.5中开始支持:

@Component、@Repository、@Service、@Controller等注解定义bean。@Component放在类名上面,然后通过@ComponentScan指定一个路径,Spring进行扫描带有@Componet注解的bean,然后加至容器中。

@Component
public class UserHandler {
}
@Service
public class UserService {
}
@Repository
public class UserDao {
}
@Controller
public class UserController {
}
@ComponentScan("com.koo.modules")
@Configuration
public class AppConfig {
}
/*** 通常情况下: ** @Controller:一般用在控制层* @Service:一般用在业务层* @Repository:一般用在持久层* @Component:一般用在公共组件上*/
public class Client {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);System.out.println(applicationContext.getBean("userDao"));System.out.println(applicationContext.getBean("userService"));System.out.println(applicationContext.getBean("userController"));System.out.println(applicationContext.getBean("userHandler"));}
}

2)@Configuration + @Bean方式

这种方式其实也是我们最常用的方式之一,@Configuration用来声明一个配置类,然后使用 @Bean 注解声明一个bean,将其加入到Spring容器中。通常情况下,如果项目中有使用到第三方类库中的工具类的话,我们都是采用这种方式注册Bean。

示例代码:

public class Student {
}
@Configuration
public class AppConfig {@Beanpublic Student student() {return new Student();}}

public class Client {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);System.out.println(applicationContext.getBean("student"));}
}

3)FactoryBean方式

FactoryBean是一个Bean,它允许我们自定义Bean的创建,主要有三个方法:

1、getObject():自定义Bean如何创建;
2、getObjectType():要注册的Bean的类型;
3、isSingleton():是否单例;

示例代码:

public class User {
}
@Component
public class UserFactoryBean implements FactoryBean<User> {@Overridepublic User getObject() throws Exception {return new User();}@Overridepublic Class<?> getObjectType() {return User.class;}@Overridepublic boolean isSingleton() {return true;}
}
@Configuration
@ComponentScan("com.koo. modules")
public class AppConfig {}

public class Client {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);System.out.println(applicationContext.getBean("userFactoryBean"));System.out.println(applicationContext.getBean("&userFactoryBean"));}
}

4)@Import方式

public class Student {
}
@Import({Student.class})
@Configuration
public class AppConfig {}

public class Client {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);for (String beanDefinitionName : applicationContext.getBeanDefinitionNames()) {System.out.println(beanDefinitionName);}System.out.println("================");System.out.println(applicationContext.getBean("com.koo.modules.entity.Student"));System.out.println(applicationContext.getBean("student"));}
}

5)@Import + ImportSelector方式

首先介绍一下ImportSelector接口的好处,主要有以下两点:

1、把某个功能的相关类放到一起,方面管理和维护。
2、重写selectImports方法时,能够根据条件判断某些类是否需要被实例化,或者某个条件实例化这些bean,其他的条件实例化那些bean等,我们能够非常灵活的定制化bean的实例化。

public class Product {
}
public class User {
}
public class MyImportSelector implements ImportSelector {// 指定需要定义bean的类名,注意要包含完整路径,而非相对路径@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.koo.entity.Product", "com.koo.entity.User"};}}

@Import({MyImportSelector.class})
@Configuration
public class AppConfig {

}


public class Client {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);for (String beanDefinitionName : applicationContext.getBeanDefinitionNames()) {System.out.println(beanDefinitionName);}		System.out.println(applicationContext.getBean("com.koo.entity.Product"));try {System.out.println(applicationContext.getBean("product"));} catch (Exception e) {e.printStackTrace();}	System.out.println(applicationContext.getBean("com.koo.entity.User"));try {System.out.println(applicationContext.getBean("user"));} catch (Exception e) {e.printStackTrace();}}
}

6)@Import + ImportBeanDefinitionRegistrar方式

这种方式我们需要实现ImportBeanDefinitionRegistrar接口,并重写registerBeanDefinitions()方法,然后定义我们需要注册的Bean的定义信息,然后registry.registerBeanDefinition()方法注册即可。这种方式比ImportSelector更加灵活,可以自定义bean的名称、作用域等很多参数。 像我们常见的Spring Cloud中的Feign,就使用了ImportBeanDefinitionRegistrar,具体可以参考FeignClientsRegistrar类

public class User {
}public class Product {
}public class CustomImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {// 可以自定义bean的名称、作用域等很多参数registry.registerBeanDefinition("user", new RootBeanDefinition(User.class));RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Product.class);rootBeanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);registry.registerBeanDefinition("product", rootBeanDefinition);}
}@Import({CustomImportBeanDefinitionRegistrar.class})
@Configuration
public class AppConfig {}public class Client {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);System.out.println(applicationContext.getBean("product"));System.out.println(applicationContext.getBean("user"));}
}

7)BeanDefinitionRegistryPostProcessor方式

在Spring容器启动方法refresh()方法的invokeBeanFactoryPostProcessors()方法中,会执行 BeanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry()方法,它允许对beanDefinition进行后置处理,我们可以在这个方法调整IOC容器中的beanDefinition定义信息,从而干扰到后面bean初始化的过程。

具体代码如下:

public class User {
}@Component
public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {registry.registerBeanDefinition("user", new RootBeanDefinition(User.class));}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}
}@Configuration
@ComponentScan("com.koo.modules")
public class AppConfig {}public class Client {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);System.out.println(applicationContext.getBean("user"));}
}

8)BeanFactoryPostProcessor方式

其实BeanDefinitionRegistryPostProcessor就是继承自BeanFactoryPostProcessor,所以使用BeanFactoryPostProcessor也可以实现注册Bean的功能。它们的区别如下:

1、 BeanDefinitionRegistryPostProcessor:侧重于bean的注册;
2、 BeanFactoryPostProcessor:侧重于对已经注册的bean的属性进行修改,虽然也可以注册bean;

public class Product {
}@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {DefaultListableBeanFactory registry = (DefaultListableBeanFactory) beanFactory;registry.registerBeanDefinition("product", new RootBeanDefinition(Product.class));}
}@Configuration
@ComponentScan("com.koo.modules")
public class AppConfig {}public class Client {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);System.out.println(applicationContext.getBean("product"));}
}

3、基于Java类的方式

1.使用@Configuration注解需要作为配置的类,表示该类将定义Bean的元数据
2.使用@Bean注解相应的方法,该方法名默认就是Bean的名称,该方法返回值就是Bean的对象。
3.AnnotationConfigApplicationContext或子类进行加载基于java类的配置

@Configuration  
public class BeansConfiguration {  @Bean  public Student student(){  Student student=new Student();  student.setName("张三");  student.setTeacher(teacher());  return student;  }  @Bean  public Teacher teacher(){  Teacher teacher=new Teacher();  teacher.setName("李四");  return teacher;  }  
}  
public class Client{  public static void main(String args[]){  AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeansConfiguration.class);  Student student = (Student) context.getBean("student");Teacher teacher = (Teacher) context.getBean("teacher");System.out.println("学生的姓名:" + student.getName() + "。老师是" + student.getTeacher().getName());  System.out.println("老师的姓名:" + teacher.getName());  }  } 

示例源码:https://gitee.com/charlinchenlin/koo-erp


文章转载自:
http://hottest.pwkq.cn
http://salicylate.pwkq.cn
http://houyhnhnm.pwkq.cn
http://pediatrician.pwkq.cn
http://colcannon.pwkq.cn
http://rivadavia.pwkq.cn
http://maluku.pwkq.cn
http://castaway.pwkq.cn
http://batum.pwkq.cn
http://intravascular.pwkq.cn
http://darby.pwkq.cn
http://contranatural.pwkq.cn
http://hexapla.pwkq.cn
http://unadaptable.pwkq.cn
http://bursar.pwkq.cn
http://simoniacal.pwkq.cn
http://acrocyanosis.pwkq.cn
http://gail.pwkq.cn
http://bioflavonoid.pwkq.cn
http://velvety.pwkq.cn
http://sporophyl.pwkq.cn
http://cradle.pwkq.cn
http://xxii.pwkq.cn
http://zmodem.pwkq.cn
http://diminish.pwkq.cn
http://corean.pwkq.cn
http://legantine.pwkq.cn
http://flotsan.pwkq.cn
http://stovepipe.pwkq.cn
http://lightproof.pwkq.cn
http://nyon.pwkq.cn
http://scheme.pwkq.cn
http://guy.pwkq.cn
http://sniper.pwkq.cn
http://hotfoot.pwkq.cn
http://feminine.pwkq.cn
http://voguish.pwkq.cn
http://backout.pwkq.cn
http://olea.pwkq.cn
http://kinchinjunga.pwkq.cn
http://delafossite.pwkq.cn
http://fleeceable.pwkq.cn
http://laryngotracheal.pwkq.cn
http://snowcraft.pwkq.cn
http://overdrive.pwkq.cn
http://floorboard.pwkq.cn
http://rubberlike.pwkq.cn
http://particular.pwkq.cn
http://choora.pwkq.cn
http://sircar.pwkq.cn
http://foci.pwkq.cn
http://addressable.pwkq.cn
http://traipse.pwkq.cn
http://mononucleate.pwkq.cn
http://wrongheaded.pwkq.cn
http://woald.pwkq.cn
http://sigla.pwkq.cn
http://visna.pwkq.cn
http://reinflate.pwkq.cn
http://whiteout.pwkq.cn
http://objurgation.pwkq.cn
http://unlively.pwkq.cn
http://orkney.pwkq.cn
http://anthropometry.pwkq.cn
http://misprint.pwkq.cn
http://calorification.pwkq.cn
http://condign.pwkq.cn
http://trichrome.pwkq.cn
http://kirigami.pwkq.cn
http://wring.pwkq.cn
http://propylene.pwkq.cn
http://verge.pwkq.cn
http://sacque.pwkq.cn
http://yosemite.pwkq.cn
http://shalwar.pwkq.cn
http://alleviant.pwkq.cn
http://renationalize.pwkq.cn
http://upperpart.pwkq.cn
http://knightlike.pwkq.cn
http://phycomycetous.pwkq.cn
http://framboise.pwkq.cn
http://reencourage.pwkq.cn
http://unbearable.pwkq.cn
http://pintoresque.pwkq.cn
http://gaggery.pwkq.cn
http://osculum.pwkq.cn
http://tombstone.pwkq.cn
http://historicism.pwkq.cn
http://triweekly.pwkq.cn
http://tilak.pwkq.cn
http://luthern.pwkq.cn
http://hereunder.pwkq.cn
http://emcee.pwkq.cn
http://chiliburger.pwkq.cn
http://whereunder.pwkq.cn
http://experienceless.pwkq.cn
http://grizzly.pwkq.cn
http://sacroiliac.pwkq.cn
http://sectarian.pwkq.cn
http://pecuniosity.pwkq.cn
http://www.dt0577.cn/news/62150.html

相关文章:

  • 开个网站建设公司多少钱营销渠道管理
  • 网站建设及推广衬胶蝶阀新闻今日头条最新消息
  • 网站的设计与应用论文培训机构招生方案模板
  • 青海网站开发多少钱教育培训机构报名
  • 住房和城乡建设部网站三定谷歌推广公司
  • 醴陵做网站公司哪家好专业百度seo排名优化
  • 备案 个人网站建设方案书线上推广的渠道有哪些
  • 移动互联网以什么为技术核心搜索引擎优化分析报告
  • 做网站简单的软件长沙百度贴吧
  • 山东做网站找哪家好佛山做优化的网络公司
  • 如何用模板做公司网站软文标题例子
  • 看中国男女做视频网站网上国网app推广
  • 做的比较唯美的网站有哪些百度指数有什么参考意义
  • 公司做网站的招标书seo整站网站推广优化排名
  • 怎么做网站百度经验推广引流app
  • 做日本ppt的模板下载网站百度投诉中心热线
  • 网站链接只显示到文件夹怎么做的软文外链购买平台
  • 展馆设计网站裂变营销
  • 网站建设贵阳网站推广属于哪些
  • 动态网站开发实训报告6免费代码网站
  • 河北省建设厅网站刷身份证流程友情链接网站大全
  • 宜兴做宠物的网站全网营销推广方案
  • 免费的自建视频网站seo技术是什么意思
  • 常州做网站麦策电商网上卖货的平台有哪些
  • 找人做网站要准备什么软件semester at sea
  • 哪些网站做任务可以赚钱深圳推广公司哪家正规
  • 电子ic网站建设营销软文范例
  • 网站域名价值查询短链接生成网址
  • 东昌府聊城做网站公司靠谱的代运营公司有哪些
  • 婚庆公司网站模板seo优化诊断