Sebab: Skop lalai Bean ialah mod Singleton, yang bermakna semua orang menggunakan objek yang sama! Apabila kami mempelajari mod singleton sebelum ini, kita semua tahu bahawa menggunakan singleton boleh meningkatkan prestasi pada tahap yang besar, jadi skop Beans in Spring juga ialah mod singleton secara lalai.
@Component public class Users { @Bean public User user1(){ User user = new User(); user.setId(1); user.setName("Java"); return user; } }
@Component public class Bean1 { @Autowired private User user; public User getUser(){ System.out.println("Bean1对象未修改name之前 : "+user); user.setName("C++"); return user; } }
@Component public class Bean2 { @Autowired private User user; public User getUser(){ return user; } }
Hanya buat satu salinan sumber yang sama untuk menjimatkan ruang
Tidak perlu mencipta dan memusnahkan objek terlalu banyak, dan kelajuan pelaksanaan dipertingkatkan
Skop, secara amnya difahami sebagai: mengehadkan skop yang tersedia bagi pembolehubah dalam atur cara dipanggil ⽤ Skop, atau kawasan tertentu dalam kod sumber tempat pembolehubah ditakrifkan dipanggil skop. Skop
⽽Bea
merujuk kepada corak tingkah laku tertentu Bean
dalam keseluruhan rangka kerja Spring
Contohnya, singleton
skop tunggal bermaksud
bermaksud Bean
Hanya ada satu salinan. dalam keseluruhan Spring
, dan ia dikongsi secara global Jadi apabila orang lain mengubah suai nilai ini, apa yang
orang lain baca ialah nilai yang diubah suai.
Dalam Musim Bunga, skop sebiji kacang dipanggil model tingkah laku, kerana pada pandangan Spring, model tunggal ialah tingkah laku, yang bermaksud bahawa hanya boleh ada satu biji dalam keseluruhan Musim Bunga .
singleton: Skop kes tunggal
prototaip: Skop prototaip (skop berbilang contoh)
permintaan: Skop permintaan
sesi: skop sesi
aplikasi: skop global
soket web: Skop HTTP WebSocket
Empat terakhir terhad kepada SpringMVC, jadi pada peringkat ini kita hanya mempelajari dua yang pertama sahaja.
Berbalik kepada kes tadi, Bean2 berharap objek kacang yang diperolehi belum diubah suai, jadi kita boleh mengubah suai mod tunggal kepada mod berbilang contoh.
使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
使用@Scope("prototype")
ps
: Apabila pelaksanaan mencapai langkah memasang sifat Bean, apabila suntikan atribut diimbas, Suntikan kelas akan dihentikan dahulu, dan suntikan atribut akan diberikan dahulu, kerana kaedah kemudian mungkin menggunakan atribut ini.
Apa yang dipanggil kitaran hayat merujuk kepada keseluruhan proses hidup objek dari lahir hingga kemusnahan Kita panggil proses ini kitaran hidup objek.
Kitaran hidup Kacang dibahagikan kepada lima bahagian berikut:
1 )
2. Sifat tetapan (Suntikan dan pemasangan kacang)
3. Inisialisasi kacang
melaksanakan pelbagai kaedah pemberitahuan Aware, seperti kaedah antara muka BeanNameAware, BeanFactoryAware dan ApplicationContextAware Contohnya, apabila Spring memulakan kacang, ia perlu menetapkan id (nama) kepada kacang. Jika beanName berjaya ditetapkan, pemberitahuan beadNameAware akan dihasilkan; operasi; laksanakan init yang ditentukan sendiri kaedah -kaedah (jika dinyatakan) ialah kaedah yang dinyatakan dalam tag kacang dalam Spring; dimulakan dengan anotasi Produk era, init ialah produk era xml dan @PostConstruct ialah produk era anotasi. Keutamaan: Apabila kaedah En. Liang wujud pada masa yang sama, anotasi akan dilaksanakan terlebih dahulu, dan kemudian init akan dilaksanakan untuk melaksanakan kaedah pasca permulaan BeanPostProcessor (jika kaedah ini tidak ditindih, ikut kod sumber).4. Gunakan Bean
@PreDestroy和destroy-method的关系和初始化方法的两个关系差不多
优先级:@ProDestroy > 重写的DisposableBean接口方法 > destroy-method
执行流程图如下:
ps:
实例化和初始化的区别:实例化
就是 分配内存空间。初始化
,就是把我们一些参数,方法的具体实现逻辑给加载进去。
xml配置如下:
Bean
public class BeanLifeComponent implements BeanNameAware { @PostConstruct public void PostConstruct(){ System.out.println("执行@PostConstruct"); } public void init(){ System.out.println("执行bean-init-method"); } public void use(){ System.out.println("正在使用bean"); } @PreDestroy public void PreDestroy(){ System.out.println("执行@PreDestroy"); } public void setBeanName(String s){ System.out.println("执行了Aware通知"); } }
启动类
public class App2 { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); BeanLifeComponent beanLifeComponent = context.getBean(BeanLifeComponent.class); beanLifeComponent.use(); context.destroy(); } }
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" xmlns:content="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"> <content:component-scan base-package="com.beans"></content:component-scan> <bean id="1" class="com.beans.BeanLifeComponent" init-method="init"></bean> </beans>
@Controller public class TestUser { @Autowired private Test test; public TestUser(){ test.sayHi(); System.out.println("TestUser->调用构造方法"); } }
如果这段代码先执行了初始化,也就是其构造方法,会用到test对象,此时还没有设置属性,test就为null,会造成空指针异常。因此必须先设置属性,在进行初始化。
Atas ialah kandungan terperinci Apakah skop dan kitaran hayat Bean dalam Java Spring. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!