1. 程式人生 > 資訊 >科幻照進現實:我國工廠運維人員已應用 AR 眼鏡技術

科幻照進現實:我國工廠運維人員已應用 AR 眼鏡技術

Spring常用註解

專案中註解和XML的選擇問題

  • 學習基於註解的IOC配置,即註解配置和xml配置要實現的功能都是一樣的,都是要降低程式間的耦合,只是配置的形式不一樣
  • 關於實際開發中到底使用xml還是註解,每家公司有著不同的使用習慣
  • 註解優勢:配置簡單,維護方便
  • xml優勢:修改時,不用改原始碼,不涉及重新編譯和部署

用於建立物件的註解

註解 說明
@Component 使用在類上用於例項化Bean(普通的java物件)
@Controller 使用在web層類上用於例項化Bean (控制器型別java物件 和瀏覽器互動)
@Service 使用在service層類上用於例項化Bean (新增服務型別的程式碼上面)
@Repository 使用在dao層類上用於例項化Bean (新增到我們資料庫互動程式碼上面)

注意:

使用註解進行開發時,需要在applicationContext.xml中配置元件掃描,作用是指定哪個包及其子包下的Bean需要進行掃描以便識別使用註解配置的類、欄位和方法。

<!--註解的元件掃描-->
<context:component-scan base-package="com.ujiuye"></context:component-scan>

使用@Component或@Repository標識UserDaoImpl需要Spring進行例項化。

//@Component("userDao")
@Repository("userDao")
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
    	System.out.println("save running... ...");
    }
}

使用@Component或@Service標識UserServiceImpl需要Spring進行例項化

//@Component("userService")
@Service("userService")
public class UserServiceImpl implements UserService {
    @Override
    public void save() {       
   	  System.out.println("save running... ...");
    }
}

用於注入資料的註解

註解 說明
@Value 注入普通屬性
@Autowired 自動按照型別注入。當使用註解注入屬性時,set 方法可以省略。它只能注入其他 bean 型別。當有多個型別匹配時,使用要注入的物件變數名稱作為 bean 的 id,在 spring 容器查詢,找到了也可以注入成功。找不到就報錯
@Qualifier 結合@Autowired一起使用用於根據名稱進行依賴注入
@Resource 相當於@Autowired+@Qualifier,按照名稱進行注入

使用@Value進行字串的注入

@Repository("userDao")
public class UserDaoImpl implements UserDao {
    @Value("admin")
    private String str;
    private String driver;
    @Override
    public void save() {
        System.out.println(str);
        System.out.println(driver);
        System.out.println("save running... ...");
    }
}

使用@Autowired或者@Autowired+@Qulifier或者@Resource進行userDao的注入

//@Component("userService")
@Service("userService")
public class UserServiceImpl implements UserService {
    /*@Autowired
    @Qualifier("userDao")*/
    @Resource(name="userDao")
    private UserDao userDao;
    @Override
    public void save() {       
   	  userDao.save();
    }
}

用於改變作用範圍的註解

註解 說明
@Scope 標註Bean的作用範圍,scope取值singleton prototype request session globalsession

使用@Scope標註Bean的範圍

//@Scope("prototype")
@Scope("singleton")
public class UserDaoImpl implements UserDao {
   //此處省略程式碼
}

Spring基於註解的IOC案例

子主題 1

Spring的純註解配置

註解IOC案例待改造問題

新註解說明

註解 說明
@Configuration 用於指定當前類是一個 Spring 配置類,當建立容器時會從該類上載入註解
@ComponentScan 用於指定 Spring在初始化容器時要掃描的包。 作用和在 Spring 的 xml 配置檔案中的 <context:component-scan base-package="com.offcn"/>一樣
@Bean 使用在方法上,標註將該方法的返回值儲存到 Spring容器中
@PropertySource 用於載入xxx.properties 檔案中的配置
@Import 用於匯入其他配置類
@Configuration               //指定當前類是一個配置類,取代applicationContext.xml配置檔案
@ComponentScan("com.offcn")  //指定Spring在初始化容器時要掃描的包
@Import({xxx.class}) //匯入其他的配置類
public class SpringConfiguration {
    ...
}


@PropertySource("classpath:dbConfig.properties") //當前類中引入dbConfig.properties檔案
public class DataSourceConfiguration {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
}



@Bean(name="dataSource") //將方法的返回值存入到IOC容器當中
public DataSource getDataSource() throws Exception { 
    ComboPooledDataSource dataSource = new ComboPooledDataSource(); 
    dataSource.setDriverClass(driver);
    dataSource.setJdbcUrl(url);
    dataSource.setUser(username);
    dataSource.setPassword(password);
    return dataSource;
} 

通過註解獲取容器

public void AnnotationTest (){
        //使用AnnotationConfigApplicationContext獲得ioc容器物件
        ApplicationContext context= new AnnotationConfigApplicationContext(SpringConfig.class);
        Object obj = context.getBean("...");
    }

Spring整合Junit

IOC測試類中的問題和解決思路

在測試類中,每個測試方法都有以下兩行程式碼:

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) context.getBean("userService");

這兩行程式碼的作用是獲取容器,如果不寫的話,直接會提示空指標異常。所以又不能輕易刪掉。

整合Junit 配置步驟

  • 新增技術依賴
<properties>
    <spring.version>5.2.5.RELEASE</spring.version>
</properties>

<!--此處需要注意的是,spring5 及以上版本要求 junit 的版本必須是 4.12 及以上-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<!--匯入Spring整合Junit的依賴-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.version}</version>
</dependency>
<!--匯入spring的context依賴-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>

  • 使用@RunWith 註解替換原有執行器
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringJunitTest {
    
}
  • 使用@ContextConfiguration 指定 Spring 配置檔案的位置
@RunWith(SpringJUnit4ClassRunner.class)
//載入spring核心配置檔案
//@ContextConfiguration(value = {"classpath:applicationContext.xml"})
//載入spring核心配置類
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
    
}
  • 使用@Autowired 給測試類中的變數注入資料
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
    @Autowired
    private ApplicationContext context;
    
    @Test
    public void test(){
        ...
    }
}