參考:https://www.yuque.com/leifengyang/springboot2
參考:https://www.bilibili.com/video/BV19K4y1L7MT?p=1&vd_source=0c3c1f43c75954a15fba4e42c1d7883e
(資料圖片)
項目結(jié)構(gòu)
1. pom.xml
4.0.0 com.example springboot-test 1.0-SNAPSHOT pom springboot-01-hello org.springframework.boot spring-boot-starter-parent 2.3.4.RELEASE org.springframework.boot spring-boot-starter-web 8 8 UTF-8 org.springframework.boot spring-boot-maven-plugin
2. MainApplication
package com.example;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/** * 主程序類 * @SpringBootApplication:這是一個springboot應(yīng)用 */@SpringBootApplicationpublic class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); }}
3. HelloController
package com.example.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class HelloController { @RequestMapping("/hello") public String home() { return "Hello world"; }}
4. 啟動服務(wù),瀏覽器訪問
org.springframework.boot spring-boot-starter-parent 2.3.4.RELEASE 點進(jìn)spring-boot-starter-parent看到: org.springframework.boot spring-boot-dependencies 2.3.4.RELEASE 點進(jìn)spring-boot-dependencies看到: 幾乎聲明了所有開發(fā)中常用的依賴的版本號
org.springframework.boot spring-boot-starter 2.3.4.RELEASE compile
5.1.43
org.springframework.boot spring-boot-starter-tomcat 2.3.4.RELEASE compile
配置Tomcat ???SpringBoot幫我們配置好了所有web開發(fā)的常見場景
dispatcherServlet字符編碼:characterEncodingFilter文件上傳:multipartResolver@SpringBootApplication等同于@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan("com.example")
package com.example;import org.springframework.boot.SpringApplication;import org.springframework.boot.SpringBootConfiguration;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.ComponentScan;/**@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan("com.example")等價于@SpringBootApplication(scanBasePackages="com.example") 默認(rèn)掃描主程序所在的包*/@SpringBootApplicationpublic class MainApplication { public static void main(String[] args) { //1、返回我們IOC容器 ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); //2、查看容器里面的組件 String[] names = run.getBeanDefinitionNames(); for (String name : names) { System.out.println("組件:" + name); } }}
package com.example.bean;public class User { private String name; private int age; private Pet pet; public User() { } public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Pet getPet() { return pet; } public void setPet(Pet pet) { this.pet = pet; } @Override public String toString() { return "User{" + "name="" + name + "\"" + ", age=" + age + ", pet=" + pet + "}"; }}
Petpackage com.example.bean;public class Pet { private String name; public Pet() { } public Pet(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Pet{" + "name="" + name + "\"" + "}"; }}
MainConfigpackage com.example.config;import com.example.bean.Pet;import com.example.bean.User;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration(proxyBeanMethods=true) // 告訴springboot這是一個配置類public class MainConfig { @Bean public User userBean(){ User u = new User("zhangsan", 18); u.setPet(petBean()); return u; } @Bean public Pet petBean(){ Pet p = new Pet("cat"); return p; }}
MainApplicationpackage com.example;import com.example.bean.Pet;import com.example.bean.User;import com.example.config.MainConfig;import org.springframework.boot.SpringApplication;import org.springframework.boot.SpringBootConfiguration;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.ComponentScan;/**@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan("com.example")等價于@SpringBootApplication(scanBasePackages="com.example") 默認(rèn)掃描主程序所在的包*/@SpringBootApplicationpublic class MainApplication { public static void main(String[] args) { //1、返回我們IOC容器 ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); //2、查看容器里面的組件 String[] names = run.getBeanDefinitionNames(); for (String name : names) { System.out.println("組件:" + name); } // 3. 從容器中獲取組件 User user = (User) run.getBean("userBean"); User user2 = (User) run.getBean("userBean"); System.out.println("組件默認(rèn)是單例的:" + (user==user2)); // 4. 配置類也是組件 MainConfig bean = run.getBean(MainConfig.class); System.out.println("配置類本身也是組件:" + bean); // 5. proxyBeanMethods = true, mainConfig就是被增強(qiáng)的代理對象 // springboot總會檢查組件是否在容器中存在 // 保持組件單實例 // 外部無論對配置類中的這個組件注冊方法調(diào)用多少次,獲取的都是之前注冊容器中的單實例對象 User user3 = bean.userBean(); User user4 = bean.userBean(); System.out.println("主配置是否為代理對象: "+(user3==user4)); // full: proxyBeanMethods=true => 應(yīng)用場景: 解決組件依賴 // lite: proxyBeanMethods=false => 配置類在容器中不會保存代理對象,在外邊調(diào)用方法,每次都會產(chǎn)生一個新對象 // Full: 保證每個@Bean方法被調(diào)用多少次返回的組件都是單實例的。類組件之間有依賴關(guān)系,方法會被調(diào)用得到之前單實例組件,用Full模式 // Lite: 每個@Bean方法被調(diào)用多少次返回的組件都是新創(chuàng)建的。類組件之間無依賴關(guān)系用Lite模式加速容器啟動過程,減少判斷 // 組件依賴必須使用Full模式默認(rèn)。其他默認(rèn)是否Lite模式 Pet pet = (Pet) run.getBean("petBean"); System.out.println("proxyBeanMethods組件依賴" + (user.getPet()==pet)); }}
package com.example.config;import com.example.bean.Pet;import com.example.bean.User;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class MainConfig {}
Userpackage com.example.bean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Component;import javax.annotation.Resource;@Component("userBean")public class User { private String name; private int age; @Autowired private Pet pet; public User() { } public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Pet getPet() { return pet; } public void setPet(Pet pet) { this.pet = pet; } @Override public String toString() { return "User{" + "name="" + name + "\"" + ", age=" + age + ", pet=" + pet + "}"; }}
Petpackage com.example.bean;import org.springframework.stereotype.Component;@Component("petBean")public class Pet { private String name; public Pet() { } public Pet(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Pet{" + "name="" + name + "\"" + "}"; }}
MainApplicationpackage com.example;import com.example.bean.Pet;import com.example.bean.User;import com.example.config.MainConfig;import org.springframework.boot.SpringApplication;import org.springframework.boot.SpringBootConfiguration;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.ComponentScan;/** * @SpringBootConfiguration * @EnableAutoConfiguration * @ComponentScan("com.example") 等價于@SpringBootApplication(scanBasePackages="com.example") * 默認(rèn)掃描主程序所在的包 */@SpringBootApplicationpublic class MainApplication { public static void main(String[] args) { //1、返回我們IOC容器 ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); //2、查看容器里面的組件 String[] names = run.getBeanDefinitionNames(); for (String name : names) { System.out.println("組件:" + name); } // 3. 從容器中獲取組件 User user = (User) run.getBean("userBean"); User user2 = (User) run.getBean("userBean"); System.out.println("組件默認(rèn)是單例的:" + (user == user2)); // 4. 配置類也是組件 MainConfig bean = run.getBean(MainConfig.class); System.out.println("配置類本身也是組件:" + bean); // 5. 組件依賴 Pet pet = (Pet) run.getBean("petBean"); System.out.println("組件依賴" + (user.getPet() == pet)); }}
@Import:給容器中自動創(chuàng)建出指定類型的組件、默認(rèn)組件的名字就是全類名
@Conditional:條件裝配,滿足Conditional指定的條件,則進(jìn)行組件注入
@ImportResource:原生配置文件引入
@ConfigurationProperties:配置文件中的配置項綁定給組件的屬性
項目結(jié)構(gòu)MainApplicationpackage com.example;import ch.qos.logback.core.db.DBHelper;import com.example.bean.Pet;import com.example.bean.User;import com.example.config.MainConfig;import org.springframework.boot.SpringApplication;import org.springframework.boot.SpringBootConfiguration;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.ComponentScan;import java.util.Arrays;/** @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan("com.example") 等價于@SpringBootApplication(scanBasePackages="com.example") 默認(rèn)掃描主程序所在的包 *//** * @Import:給容器中自動創(chuàng)建出指定類型的組件、默認(rèn)組件的名字就是全類名 * @Conditional:條件裝配,滿足Conditional指定的條件,則進(jìn)行組件注入 * @ImportResource:原生配置文件引入 * @ConfigurationProperties:配置文件中的配置項綁定給組件的屬性 */@SpringBootApplicationpublic class MainApplication { public static void main(String[] args) { //1、返回我們IOC容器 ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); //2、查看容器里面的組件 String[] names = run.getBeanDefinitionNames(); for (String name : names) { System.out.println("組件:" + name); } // 3. 獲取組件 Boolean flag = run.containsBean("petBean"); System.out.println("容器中是否存在petBean組件:" + flag); Boolean flag2 = run.containsBean("userBean"); System.out.println("容器中是否存在userBean組件:" + flag2); // 4. 容器中組件數(shù)量 System.out.println("組件數(shù)量:" + run.getBeanDefinitionCount()); // 167 }}
mainApplication.xml
Userpackage com.example.bean;public class User { private String name; private int age; private Pet pet; public User() { } public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Pet getPet() { return pet; } public void setPet(Pet pet) { this.pet = pet; } @Override public String toString() { return "User{" + "name="" + name + "\"" + ", age=" + age + ", pet=" + pet + "}"; }}
Petpackage com.example.bean;public class Pet { private String name; public Pet() { } public Pet(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Pet{" + "name="" + name + "\"" + "}"; }}
Carpackage com.example.bean;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;// @Component // MainConfig中使用了@EnableConfigurationProperties(Car.class),則不用@Component@ConfigurationProperties(prefix = "car")public class Car { private String brand; private double price; public Car() { } public Car(String brand, double price) { this.brand = brand; this.price = price; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Car{" + "brand="" + brand + "\"" + ", price=" + price + "}"; }}
MainConfigpackage com.example.config;import ch.qos.logback.core.db.DBHelper;import com.example.bean.Car;import com.example.bean.Pet;import com.example.bean.User;import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.*;// @ConditionalOnBean(name="petBean") // 有petBean類里的組件注冊才生效,否則都不生效@EnableConfigurationProperties(Car.class)// @EnableConfigurationProperties(Car.class)的作用:// 1. 開啟Car配置綁定功能// 2. 把這個Car這個組件自動注冊到容器中@ImportResource("classpath:mainApplication.xml")@Import({User.class, DBHelper.class})@Configuration(proxyBeanMethods=true) // 告訴springboot這是一個配置類public class MainConfig { @ConditionalOnBean(name="petBean") // 容器中存在petBean才執(zhí)行userBean的組件注冊 @Bean public User userBean(){ User u = new User("zhangsan", 18); u.setPet(petBean()); return u; } // @Bean public Pet petBean(){ Pet p = new Pet("cat"); return p; }}
@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class}), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class})})public @interface SpringBootApplication {}
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Configuration // SpringBootConfiguration用來注解 配置類 => MainApplication是一個配置類(核心配置類)public @interface SpringBootConfiguration { @AliasFor( annotation = Configuration.class ) boolean proxyBeanMethods() default true;}
@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class})public @interface EnableAutoConfiguration {}
@AutoConfigurationPackage@Import({AutoConfigurationPackages.Registrar.class}) // 給容器中導(dǎo)入一個組件// 指定了默認(rèn)的包規(guī)則public @interface AutoConfigurationPackage {}// 利用Registrar給容器中導(dǎo)入一系列組件// 將指定的MainApplication所在包下的所有組件導(dǎo)入進(jìn)來
@Import({AutoConfigurationImportSelector.class})1. 利用getAutoConfigurationEntry(annotationMetadata)給容器中批量導(dǎo)入一些組件2. 調(diào)用List configurations = getCandidateConfigurations(annotationMetadata, attributes)獲取到所有需要導(dǎo)入到容器中的配置類3. 利用工廠加載 Map> loadSpringFactories(@Nullable ClassLoader classLoader)得到所有的組件4. 從META-INF/spring.factories位置來加載一個文件。 默認(rèn)掃描我們當(dāng)前系統(tǒng)里面所有META-INF/spring.factories位置的文件 spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories 文件里面寫死了spring-boot一啟動就要給容器中加載的所有配置類
1. 雖然我們127個場景的所有自動配置啟動的時候默認(rèn)全部加載。 META-INF/spring.factories文件中:xxxxAutoConfiguration2. 按照條件裝配規(guī)則(@Conditional),最終會按需配置。 eg. @ConditionalOnClass({Gson.class})
@Bean@ConditionalOnBean(MultipartResolver.class) //容器中有這個類型組件@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中沒有這個名字 multipartResolver 的組件public MultipartResolver multipartResolver(MultipartResolver resolver) { //給@Bean標(biāo)注的方法傳入了對象參數(shù),這個參數(shù)的值就會從容器中找。 //SpringMVC multipartResolver。防止有些用戶配置的文件上傳解析器不符合規(guī)范// Detect if the user has created a MultipartResolver but named it incorrectlyreturn resolver;}
SpringBoot默認(rèn)會在底層配好所有的組件。但是如果用戶自己配置了以用戶的優(yōu)先
@Bean@ConditionalOnMissingBeanpublic CharacterEncodingFilter characterEncodingFilter() {}
總結(jié):
SpringBoot先加載所有的自動配置類 xxxxxAutoConfiguration每個自動配置類按照條件進(jìn)行生效,默認(rèn)都會綁定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件進(jìn)行了綁定生效的配置類就會給容器中裝配很多組件(pom.xml配置了)只要容器中有這些組件,相當(dāng)于這些功能就有了定制化配置用戶直接自己@Bean替換底層的組件用戶去看這個組件是獲取的配置文件什么值就去修改。xxxxxAutoConfiguration ---> 組件 ---> xxxxProperties里面拿值 ----> application.properties
spring.banner.image.location=classpath:timg.jpg
org.projectlombok lombok
idea安裝插件使用@ToString // toString@Data // getter、setter@AllArgsConstructor // 全參構(gòu)造器@NoArgsConstructor // 無參構(gòu)造器@Slf4j // 日志
例子package com.example.bean;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.ToString;@ToString // toString@Data // getter、setter@AllArgsConstructor // 全參構(gòu)造器@NoArgsConstructor // 無參構(gòu)造器public class LombokBean { private String str; private int i;}
import com.example.bean.LombokBean;import lombok.extern.slf4j.Slf4j;import org.junit.Test;@Slf4jpublic class LombokBeanTest { @Test public void testLombokBean(){ LombokBean o = new LombokBean(); o.setStr("abc"); o.setI(10); System.out.println(o); log.info(o.toString()); }}
參考:https: www yuque com leifengyang springboot2
我們每天都吃五六顆紅棗紅棗是補(bǔ)血的每天都可以當(dāng)零食吃蒸熟了也可以吃最好的方法是把紅棗洗干凈,蒸熟了放在冰箱里面但是時間只能三天以內(nèi)就
甘肅省舉辦職業(yè)技能等級認(rèn)定考評員培訓(xùn)
我原來想三臺車都上馬力機(jī),是不是很大膽?一擋混動、兩擋混動、三擋混動,都拉馬力。就那一個坐標(biāo)系,就完全是那個坐標(biāo)系,放三條曲線,一目
一季度我國人民幣貸款增加10 6萬億元,對實體經(jīng)濟(jì)發(fā)放的人民幣貸款占同期社會融資規(guī)模的73 6%……最新出爐的首季金融統(tǒng)計數(shù)據(jù)亮點不少,呈現(xiàn)信
全國最大禽蛋交易市場將在館陶遷址重建總投資18億元,建成運營后,預(yù)計年交易額超200億元縱覽客戶端訊(河北日報記者劉劍英
華爾街談AI炒股:股市本質(zhì)上就不是AI能贏的領(lǐng)域,股市,華爾街,炒股,股票,ai,基金
新華社北京4月12日電外交部發(fā)言人汪文斌12日宣布:應(yīng)國務(wù)委員兼外交部長秦剛邀請,德國外長貝爾伯克將于4月13日至15日對中國進(jìn)行正式訪問。其
有關(guān)系特別好的女性朋友,可以送一些比較有創(chuàng)意的禮物,像是定制的抱枕、抱枕、抱枕、抱枕、抱枕等等,這些禮物都是很適合送女性
1、刑法修正案一共有十個,刑法修正案(十一)草案已經(jīng)提出。2、1999年的刑法修正案(一),2001年的刑法修正案(二)
今天來聊聊關(guān)于穩(wěn)心顆粒可以長期吃有副作用嗎,穩(wěn)心顆粒可以長期吃的文章,現(xiàn)在就為大家來簡單介紹下穩(wěn)心顆粒可以長期吃有副作用
科陸電子(002121)4月12日在互動平臺回答投資者提問時表示,目前公司儲能產(chǎn)品采用磷酸鐵鋰電池。本文到此結(jié)束,希望對
電池級碳酸鋰價格跌破20萬元 噸大關(guān)。
川觀新聞記者史曉露4月12日,國家統(tǒng)計局四川調(diào)查總隊發(fā)布的數(shù)據(jù)顯示,2023年3月,四川工業(yè)生產(chǎn)者出廠價格指數(shù)(簡稱:PPI)同比下降1 6%,環(huán)比
這是兩部在網(wǎng)絡(luò)上很難找到劇透的戲劇。觀眾能看到的,是它們在豆瓣上8 6的高分,和越來越多人在社交平臺的“自來水”留言。它們便是正在上海文
安徽安慶市正式成立“老年助餐慈善基
記者日前從安慶市民政局獲悉,該市慈善會近日設(shè)立老年助餐慈善基金,共同守護(hù)老年人舌尖上的幸福。該基金專項用于資助城鄉(xiāng)社區(qū)老年食堂、社
安徽淮北積極落實2022年電網(wǎng)防汛度汛
近日,國網(wǎng)淮北供電公司工作人員來到110千伏中泰變電站開展防汛隱患排查。該公司積極落實2022年防汛度汛措施,提前細(xì)化應(yīng)急預(yù)案,推進(jìn)極端
安徽全椒縣完善拓展人力信息資源助企
今年以來,全椒縣不斷完善拓展人力資源信息庫、勞務(wù)對接信息庫、企業(yè)用工需求信息庫三庫信息資源,已摸排400多家次企業(yè)缺工崗位信息1 2萬個
宿州市埇橋區(qū)柔性引進(jìn)博士推進(jìn)鄉(xiāng)村振
宿州市埇橋區(qū)實施博士匯工程,柔性引進(jìn)29名博士擔(dān)任副鄉(xiāng)鎮(zhèn)長或園區(qū)副主任,他們將為加快產(chǎn)業(yè)發(fā)展、推進(jìn)鄉(xiāng)村振興強(qiáng)化智力支持。目前,博士專
安徽印發(fā)出臺全面實施零基預(yù)算改革方
為進(jìn)一步提高財政資源配置效率和資金使用效益,省政府印發(fā)《安徽省全面實施零基預(yù)算改革方案》,明確從編制2023年預(yù)算起,在全省范圍內(nèi)全面
5月份安徽居民消費價格同比上漲2.3%
近日,國家統(tǒng)計局安徽調(diào)查總隊發(fā)布了我省5月份居民消費價格統(tǒng)計數(shù)據(jù)。統(tǒng)計顯示,我省居民消費價格同比上漲2 3%,同比漲幅比上月回落0 4個百分
安徽多種方式引導(dǎo)群眾防范非法集資風(fēng)
合肥地鐵1號線、3號線上滾動播放防范非法集資宣傳視頻,淮南市發(fā)布《致老年群眾的一封信》……6月份是一年一度防范和處置非法集資宣傳月,今
鐵路部門持續(xù)加大長三角地區(qū)運力投放
記者從中國鐵路上海局集團(tuán)有限公司獲悉,隨著上海疫情防控形勢持續(xù)向好,為進(jìn)一步適應(yīng)旅客出行需要,助力復(fù)工復(fù)產(chǎn),鐵路部門自6月10日起持續(xù)加
安徽六安持續(xù)精準(zhǔn)施策全力促進(jìn)工業(yè)發(fā)
六安市與蔚來汽車簽署合作協(xié)議,共建智能電動汽車零部件配套產(chǎn)業(yè)園區(qū)。該園區(qū)一期計劃2023年上半年投產(chǎn),建成后將具備年產(chǎn)30萬噸鋁壓鑄產(chǎn)能,
安徽淮北全力維護(hù)外賣送餐員合法權(quán)益
為切實防范化解新業(yè)態(tài)領(lǐng)域重大風(fēng)險隱患,強(qiáng)化外賣送餐員權(quán)益保障工作,淮北市市場監(jiān)管局充分發(fā)揮職能作用,全力維護(hù)外賣送餐員合法權(quán)益。淮北
湖南漣源開展專項行動一對一為企業(yè)紓
位于漣源市的湖南三合美新材料科技有限公司,兩條生產(chǎn)線滿負(fù)荷運行,生產(chǎn)聚氨酯和巖棉復(fù)合板。因產(chǎn)品升級與產(chǎn)能擴(kuò)充,急需新增兩條生產(chǎn)線,
湖南藍(lán)山縣進(jìn)村入戶排查整治自建房安
老叔,這棟房屋墻體有開裂痕跡,要維修加固,安全重要!5月20日,藍(lán)山縣塔峰鎮(zhèn)果木村,黨員干部上門開展農(nóng)村自建房安全隱患排查整治。連日來
一季度湖南萬元產(chǎn)值綜合能耗同比下降
近日,湖南省工業(yè)通信業(yè)節(jié)能監(jiān)察中心發(fā)布一季度全省六大高耗能行業(yè)能源消耗統(tǒng)計監(jiān)測報告。據(jù)該報告,一季度全省146家主要高耗能企業(yè)的萬元
濟(jì)南起步區(qū)一年來累計簽約優(yōu)質(zhì)項目11
萬里黃河第一隧濟(jì)南黃河濟(jì)濼路隧道建成通車,占地4000余畝的新能源乘用車零部件產(chǎn)業(yè)園加快施工……記者21日采訪獲悉,建設(shè)實施方案獲批復(fù)一
山東發(fā)布通知啟動傳統(tǒng)民居保護(hù)利用試
省住房城鄉(xiāng)建設(shè)廳、省財政廳近日聯(lián)合印發(fā)《關(guān)于做好傳統(tǒng)民居保護(hù)利用試點工作的通知》,在全省部署開展傳統(tǒng)民居保護(hù)利用試點工作。此次試點