- Tạo ứng dụng Spring Boot bằng Spring Launchizr
- Cấu hình Cassandra trong Spring Boot
- Định cấu hình nhóm kết nối Tomcat trên Spring Boot
- Định tuyến tin nhắn Camel đến Artemis được nhúng bằng WildFly
Việc tạo ra các Bean trong Spring là một mô hình Factory điển hình. Chuỗi Bean Factory này, tức là các IOC container, cung cấp cho các nhà phát triển nhiều tiện ích và dịch vụ cơ bản để quản lý sự phụ thuộc giữa các đối tượng. Có nhiều cách triển khai IOC container trong Spring. mối quan hệ giữa chúng được thể hiện trong hình dưới đây
Trong số đó, BeanFactory, là giao diện cấp cao nhất, xác định các thông số chức năng cơ bản của bộ chứa IOC. Tuy nhiên, có thể tìm thấy ba giao diện phụ quan trọng: ListableBeanFactory, HierarchicalBeanFactory và AutowireCapableBeanFactory. lớp triển khai là DefaultListableBeanFactory, lớp này triển khai tất cả các giao diện
Mỗi giao diện có các trường hợp sử dụng riêng, chủ yếu để phân biệt việc truyền và chuyển đổi các đối tượng trong quá trình hoạt động nội bộ của Spring và các hạn chế về quyền truy cập dữ liệu vào các đối tượng.
Mã nguồn BeanFactory
giao diện công cộng BeanFactory { String FACTORY_BEAN_PREFIX = "&"; //Lấy đối tượng Bean trong bộ chứa IOC dựa trên tên Bean Object getBean(String name) ném BeansException; //Lấy đối tượng Bean trong bộ chứa IOC dựa trên tên Bean , và Chỉ định loại đối tượng đậu thu được, để chúng ta không cần gõ cast khi sử dụng nó T getBean(String name, Class requireType) ném BeansException; Đối tượng getBean(Tên chuỗi, Đối tượng... args) ném ra BeansException; T getBean(Class requireType) ném ra BeansException T getBean(Class requireType, Object... args) ném BeansException ObjectProvider getBeanProvider(Class requireType); getBeanProvider(ResolvableType requireType); //Xác định xem container có chứa đối tượng Bean với tên được chỉ định hay không boolean containsBean(String name); //Xác định xem nó có phải là singleton hay không dựa trên tên của Bean boolean isSingleton(String name) ném NoSuchBeanDefinitionException ; boolean isPrototype(String name ) ném NoSuchBeanDefinitionException; boolean isTypeMatch(String name, ResolvableType typeToMatch) ném ra NoSuchBeanDefinitionException; boolean isTypeMatch(String name, Class> typeToMatch) ném NoSuchBeanDefinitionException; @Nullable Class> getType(String name) ném NoSuchBeanDefinitionException String[] getAliases(String name);
Trong BeanFactory, chỉ xác định hành vi cơ bản của vùng chứa IOC và nó không quan tâm đến cách Bean được xác định và tải. Nói cách khác, nó chỉ quan tâm đến những sản phẩm nào có thể lấy được từ nhà máy và không quan tâm. về cách nhà máy sản xuất những sản phẩm này.
BeanFactory có một giao diện con rất quan trọng đó là giao diện ApplicationContext. Giao diện này chủ yếu điều chỉnh xem đối tượng Bean trong container có được tải không bị trễ hay không, tức là khi đối tượng container được tạo, đối tượng Bean sẽ được khởi tạo và lưu trữ trong đó. một thùng chứa.
Để biết nhà máy tạo ra các đối tượng như thế nào, bạn cần xem cách triển khai bộ chứa IOC cụ thể. Spring cung cấp nhiều cách triển khai bộ chứa IOC, chẳng hạn như:
Bộ chứa Spring IOC quản lý các đối tượng Bean khác nhau mà chúng ta xác định và các mối quan hệ của chúng, đồng thời các đối tượng Bean được BeanDefinition mô tả trong quá trình triển khai Spring.
Quá trình phân tích cú pháp đậu rất phức tạp và các chức năng được phân chia rất tinh vi, vì có nhiều chỗ cần được mở rộng và phải đảm bảo đủ tính linh hoạt để đối phó với những thay đổi có thể xảy ra. Phân tích cú pháp Bean chủ yếu là phân tích các tệp cấu hình Spring. Quá trình phân tích cú pháp này chủ yếu được hoàn thành thông qua BeanDefinitionReader
Mã nguồn BeanDefinitionReader
giao diện công khai BeanDefinitionReader { //Lấy đối tượng đăng ký BeanDefinitionRegistry BeanDefinitionRegistry getRegistry(); @Nullable ResourceLoader getResourceLoader(); @Nullable ClassLoader getBeanClassLoader(); / int LoadBeanDefinitions(Resource Resource) ném BeanDefinitionStoreException; int LoadBeanDefinitions(Resource... Resources) ném BeanDefinitionStoreException; int LoadBeanDefinitions(String location) ném BeanDefinitionStoreException;
BeanDefinitionReader được sử dụng để phân tích các định nghĩa Bean và đóng gói các đối tượng BeanDefinition. Có nhiều thẻ Bean được xác định trong tệp cấu hình, vì vậy có một câu hỏi là các đối tượng BeanDefinition được phân tích cú pháp được lưu trữ ở đâu? Câu trả lời là trung tâm đăng ký BeanDefinition và giao diện cấp cao nhất của trung tâm đăng ký là BeanDefinitionRegistry
Mã nguồn BeanDefinitionRegistry
giao diện công cộng BeanDefinitionRegistry mở rộng AliasRegistry { //Đăng ký đậu trong sổ đăng ký void registerBeanDefinition(String BeanName, BeanDefinition BeanDefinition) ném BeanDefinitionStoreException; //Xóa Bean có tên được chỉ định khỏi sổ đăng ký void RemoveBeanDefinition(String BeanName) ném NoSuchBeanDefinitionException; //Nhận đăng ký; Bean có tên được chỉ định trong bảng BeanDefinition getBeanDefinition(String BeanName) sẽ ném ra NoSuchBeanDefinitionException; //Xác định xem đậu có tên được chỉ định đã được đăng ký trong sổ đăng ký hay chưa boolean containsBeanDefinition(String BeanName); //Lấy tên của tất cả các đậu trong chuỗi đăng ký[] getBeanDefinitionNames(); (Tên đậu chuỗi); }
ClassPathXmlApplicationContext tải tài nguyên cấu hình Bean bắt đầu từ phương thức Refresh(). Phương thức Refresh() là một phương thức mẫu chỉ định quy trình khởi động của bộ chứa IOC và một số logic phải được các lớp con của nó triển khai. Nó tải tài nguyên cấu hình Bean. ClassPathXmlApplicationContext bắt đầu quá trình tải định nghĩa Bean bằng toàn bộ vùng chứa IOC bằng cách gọi phương thức Refresh() của lớp cha của nó là Tóm tắtApplicationContext.
Bây giờ chúng ta cần phân tích tệp cấu hình sau và tùy chỉnh IOC của Spring framework để quản lý các đối tượng liên quan.
Lớp giá trị thuộc tính
Thuộc tính dùng để đóng gói Bean là đóng gói dữ liệu thẻ thuộc tính của thẻ phụ của thẻ Bean.
package com.henrik.framework.beans; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; // Được sử dụng để đóng gói các thuộc tính của thẻ thuộc tính trong thẻ Bean @Data @AllArgsConstructor @NoArgsConstructor public class PropertyValue { Private Tên chuỗi riêng tư Giá trị chuỗi riêng tư;
Giá trị thuộc tính có thể thay đổi
Một thẻ đậu có thể có nhiều thẻ phụ thuộc tính, do đó hãy xác định lớp MutablePropertyValues để lưu trữ và quản lý nhiều đối tượng PropertyValue.
package com.henrik.framework.beans; import java.util.ArrayList; import java.util.Iterator; // Được sử dụng để lưu trữ và quản lý nhiều đối tượng PropertyValue // Sử dụng các triển khai mẫu lặp của lớp publicPropertyValues Iterable{ // Xác định đối tượng tập hợp danh sách, được sử dụng để lưu trữ các đối tượng PropertyValue riêng tư cuối cùng List propertyValueList public; MutablePropertyValues() { propertyValueList = new ArrayList(); } public MutablePropertyValues(List propertyValueList){ if(propertyValueList == null) { this.propertyValueList = new ArrayList(); propertyValueList = propertyValueList; } } // Lấy tất cả các đối tượng PropertyValue và trả về chúng dưới dạng một mảng public PropertyValue[] getPropertyValues(){ // Chuyển đổi tập hợp thành một mảng và trả về return propertyValueList.toArray(new PropertyValue[0] } // Lấy đối tượng PropertyValue dựa trên giá trị thuộc tính tên public PropertyValue getPropertyValue(String propertyName){ // Duyệt qua đối tượng bộ sưu tập cho (PropertyValue propertyValue : propertyValueList) { if (propertyValue.getName().equals(propertyName)){ return propertyValue } } return null; } // Xác định xem bộ sưu tập có trống public boolean isEmpty(){ return propertyValueList.isEmpty() } // Thêm một Đối tượng PropertyValue // Mục đích trả về đối tượng hiện tại là thực hiện lập trình chuỗi public MutablePropertyValues addPropertyValue(PropertyValue pv){ // Xác định xem đối tượng PropertyValue được lưu trữ trong bộ sưu tập có giống với đối tượng được truyền vào for hay không (int i = 0; i < propertyValueList.size(); i++) { // Lấy từng đối tượng PropertyValue trong bộ sưu tập PropertyValue currentPv = propertyValueList.get(i); if (currentPv.getName().equals(pv.getName())){ propertyValueList.set(i, pv); this; } } this.propertyValueList.add(pv); return this; } // Xác định xem có đối tượng nào có tên được chỉ định không, giá trị thuộc tính public boolean contains(String propertyName){ return getPropertyValue(propertyName) != null; / Lấy đối tượng lặp @Override public Iterator iterator() { return propertyValueList.iterator();
BeanĐịnh nghĩa
Lớp BeanDefinition dùng để gói gọn các thông tin của Bean, chủ yếu bao gồm id (tên đối tượng Bean), lớp (tên lớp đầy đủ của lớp cần quản lý bởi spring) và dữ liệu thuộc tính thẻ phụ.
package com.henrik.framework.beans; import lombok.AllArgsConstructor; import lombok.Data; // Dùng để đóng gói thông tin Bean, chủ yếu bao gồm id (tên đối tượng Bean), class (tên đầy đủ của lớp cần được quản lý bởi spring) tên lớp) và dữ liệu thuộc tính thẻ phụ @Data @AllArgsConstructor lớp công khai BeanDefinition { id chuỗi riêng; tên chuỗi riêng tư MutablePropertyValues propertyValues; public BeanDefinition(){ propertyValues = new MutablePropertyValues();
Giao diện đăng ký BeanDefinition
Giao diện BeanDefinitionRegistry xác định các hoạt động liên quan của sổ đăng ký và xác định các chức năng sau:
package com.henrik.framework.beans.factory.support; import com.henrik.framework.beans.BeanDefinition; // Đối tượng đăng ký giao diện công khai BeanDefinitionRegistry { //Đăng ký đối tượng BeanDefinition vào sổ đăng ký void registerBeanDefinition(String BeanName, BeanDefinition BeanDefinition ); // Xóa đối tượng BeanDefinition với tên được chỉ định khỏi sổ đăng ký void getBeanDefinition(String BeanName) ném Ngoại lệ; //Lấy đối tượng BeanDefinition từ sổ đăng ký theo tên BeanDefinition getBeanDefinition(String BeanName) ném Ngoại lệ; boolean containsBeanDefinition(String BeanName); int getBeanDefinitionCount();
Lớp đăng ký SimpleBeanDefinition
Lớp này triển khai giao diện BeanDefinitionRegistry và định nghĩa bộ sưu tập Bản đồ làm vùng chứa đăng ký.
package com.henrik.framework.beans.factory.support; import com.henrik.framework.beans.BeanDefinition; import java.util.HashMap; import java.util.Map; lớp công khai SimpleBeanDefinitionRegistry triển khai BeanDefinitionRegistry{ // Xác định một vùng chứa, Được sử dụng để lưu trữ các đối tượng BeanDefinition riêng tư Map BeanDefinitionMap = new HashMap<>(); @Override public void registerBeanDefinition(String BeanName, BeanDefinition BeanDefinition) { BeanDefinitionMap.put(beanName, BeanDefinition); } @Override public void RemoveBeanDefinition(String BeanName) ném ngoại lệ { BeanDefinitionMap.remove(beanName); } @Override public BeanDefinition getBeanDefinition(String); BeanName) ném Ngoại lệ { return BeanDefinitionMap.get(beanName); } @Override public boolean containsBeanDefinition(String BeanName) { return BeanDefinitionMap.containsKey(beanName); } @Override public int getBeanDefinitionCount() { return BeanDefinitionMap.size() } @Override public String[] getBeanDefinitionNames() { return BeanDefinitionMap.keySet; ().toArray(Chuỗi mới[0]);
Giao diện BeanDefinitionReader
BeanDefinitionReader được sử dụng để phân tích các tệp cấu hình và đăng ký thông tin Bean trong sổ đăng ký. Hai thông số kỹ thuật được xác định:
package com.henrik.framework.beans.factory.support; // Được sử dụng để phân tích các tệp cấu hình và xác định thông số kỹ thuật giao diện chung BeanDefinitionReader { //Lấy đối tượng đăng ký BeanDefinitionRegistry getRegistry(); //Tải tệp cấu hình và đăng ký nó vào sổ đăng ký void LoadBeanDefinitions(String configLocation) ném Ngoại lệ }
Lớp XmlBeanDefinitionReader
Lớp XmlBeanDefinitionReader được sử dụng đặc biệt để phân tích các tệp cấu hình xml. Lớp này triển khai giao diện BeanDefinitionReader và triển khai hai hàm trong giao diện
gói com.henrik.framework.beans.factory.xml; nhập com.henrik.framework.beans.BeanDefinition; nhập com.henrik.framework.beans.MutablePropertyValues; nhập com.henrik.framework.beans.PropertyValue; nhập .framework.beans.factory.support.BeanDefinitionReader; com.henrik.framework.beans.factory.support.BeanDefinitionRegistry; nhập com.henrik.framework.beans.factory.support.SimpleBeanDefinitionRegistry; nhập org.dom4j.Document; nhập org.dom4j.Element; SAXReader; nhập java.io.InputStream; nhập java.util.List lớp công khai XmlBeanDefinitionReader; triển khai BeanDefinitionReader { //Khai báo đối tượng đăng ký riêng tư Đăng ký BeanDefinitionRegistry công khai // Sử dụng dome4j để phân tích tệp cấu hình xml SAXReader; reader = new SAXReader(); // Lấy file cấu hình theo đường dẫn lớp inputStream là = XmlBeanDefinitionReader.class.getClassLoader().getResourceAsStream(configLocation); trên đối tượng Document (Beans) Element rootElement = document.getRootElement(); // Lấy tất cả các đối tượng thẻ Bean dưới thẻ gốc List BeanElements = rootElement.elements("bean"); // Duyệt qua bộ sưu tập cho (Element BeanElement : BeanElements) { // Lấy thuộc tính id String id = BeanElement.attributeValue("id"); .attributeValue( "class"); // Được gói gọn trong BeanDefinition BeanDefinition BeanDefinition = new BeanDefinition(); BeanDefinition.setClassName(className); // Tạo đối tượng mutablePropertyValues MutablePropertyValues mutablePropertyValues = new MutablePropertyValues(); // Lấy thẻ thuộc tính List propertyElements = BeanElement.elements("property"); : propertyElements) { Tên chuỗi = propertyElement.attributeValue("name"); Giá trị chuỗi = propertyElement.attributeValue("value"); Chuỗi ref = propertyElement.attributeValue("ref"); PropertyValue propertyValue = new PropertyValue(name,value,ref); mutablePropertyValues.addPropertyValue(propertyValue); BeanDefinition.setPropertyValues(mutablePropertyValues); register.registerBeanDefinition(id,beanDefinition); } } }
Giao diện BeanFactory
Xác định đặc tả thống nhất của bộ chứa IOC trong giao diện này, nghĩa là lấy đối tượng Bean
package com.henrik.framework.beans.factory; // Giao diện công khai của bộ chứa IOC BeanFactory { Đối tượng getBean(Tên chuỗi) ném Ngoại lệ T getBean(Tên chuỗi, Lớp mở rộng T> clazz) ném Ngoại lệ; }
Giao diện bối cảnh ứng dụng
Tất cả các lớp triển khai phụ của giao diện này đều tạo các đối tượng đậu không bị trì hoãn, do đó chúng được xác định trong giao diện này làm cho khỏe lại() phương pháp, chủ yếu hoàn thành hai chức năng sau:
package com.henrik.framework.context; import com.henrik.framework.beans.factory.BeanFactory; //Xác định chức năng tải không bị trì hoãn giao diện chung ApplicationContext mở rộng BeanFactory { //Tải tệp cấu hình và tạo đối tượng void Refresh() ném IllegalStateException , Ngoại lệ; }
Lớp Tóm tắtApplicationContext
gói com.henrik.framework.context.support; nhập com.henrik.framework.beans.BeanDefinition; nhập com.henrik.framework.beans.factory.support.BeanDefinitionReader; BeanDefinitionRegistry; nhập com.henrik.framework.context.ApplicationContext; nhập java.util.HashMap; java.util.Map; // Lớp thực hiện phụ của giao diện ApplicationContext, được sử dụng để tải ngay lập tức lớp trừu tượng công khai Tóm tắtApplicationContext triển khai ApplicationContext { // Khai báo các biến phân tích cú pháp được bảo vệ BeanDefinitionReader BeanDefinitionReader // Xác định vùng chứa bản đồ để lưu trữ các đối tượng Bean được bảo vệ Map< String, Object> singletonObjects = new HashMap<>(); // Khai báo biến của đường dẫn tệp cấu hình được bảo vệ String configLocation @Override public void Refresh(); ném IllegalStateException, Exception { // Tải đối tượng BeanDefinition BeanDefinitionReader.loadBeanDefinitions(configLocation); // Khởi tạo Bean finishBeanInitialization(); } private void finishBeanInitialization() ném Exception { // Lấy đối tượng đăng ký BeanDefinitionRegistry register = BeanDefinitionReader.getRegistry() ; / / Lấy đối tượng BeanDefinition String[] BeanNames = register.getBeanDefinitionNames(); for (String BeanName : BeanNames) { BeanDefinition BeanDefinition = register.getBeanDefinition(beanName);
Mẹo: Phương thức getBean() được gọi trong phương thức finishBeanInitialization() của lớp này sử dụng mẫu phương thức mẫu.
Lớp ClassPathXmlApplicationContext
Lớp này chủ yếu tải tệp cấu hình theo đường dẫn lớp và tạo các đối tượng Bean. Nó chủ yếu hoàn thành các chức năng sau:
gói com.henrik.framework.context.support; nhập com.henrik.framework.beans.BeanDefinition; nhập com.henrik.framework.beans.MutablePropertyValues nhập com.henrik.framework.beans.PropertyValue; nhập .beans.factory.support.BeanDefinitionRegistry; com.henrik.framework.beans.factory.xml.XmlBeanDefinitionReader; import com.henrik.framework.utils.StringUtils import java.lang.reflect.Method; // Lớp con triển khai cụ thể của bộ chứa IOC được sử dụng để tải lớp đường dẫn Tệp cấu hình ở định dạng xml public class ClassPathXmlApplicationContext mở rộng Tóm tắtApplicationContext{ public ClassPathXmlApplicationContext(String configLocation){ this.configLocation = configLocation; // Xây dựng đối tượng phân tích cú pháp BeanDefinitionReader = new XmlBeanDefinitionReader(); try { this.refresh(); }catch (Exception e){ } } // Lấy đối tượng Bean @ theo tên của đối tượng Bean Ghi đè đối tượng công khai getBean(String name) ném Ngoại lệ { Object obj = singletonObjects.get(name); return obj; BeanDefinitionRegistry register = BeanDefinitionReader.getRegistry(); BeanDefinition BeanDefinition = register.getBeanDefinition(name); Chuỗi className = BeanDefinition.getClassName(); Class> clazz = Class.forName(className); (); Thuộc tính MutablePropertyValues = BeanDefinition.getPropertyValues(); cho (PropertyValue propertyValue : propertyValues) { Chuỗi propertyName = propertyValue.getName(); Giá trị chuỗi = propertyValue.getValue(); Chuỗi ref = propertyValue.getRef(); ".equals(ref)) { Đối tượng Bean = getBean(ref); String MethodName = StringUtils.getSetterMethodNameByFieldName(propertyName); Method[] Method = clazz.getMethods(); for (Phương thức phương thức: các phương thức) { if(method.getName().equals(methodName)) { // Thực thi phương thức đã đặt Method.invoke( BeanObj,bean); } } } if(value != null && !".equals(value)) { Chuỗi MethodName = StringUtils.getSetterMethodNameByFieldName(propertyName(propertyName); Phương thức phương thức = clazz.getMethod(methodName, String.class); Method.invoke(beanObj,value); ,beanObj); trả về null } @Override public T getBean(Tên chuỗi, Lớp mở rộng T> clazz) ném Ngoại lệ { Object Bean = getBean(name); if(bean != null) { return clazz.cast(bean); return null;
gói com.henrik.controller; nhập com.henrik.framework.context.ApplicationContext; nhập com.henrik.framework.context.support.ClassPathXmlApplicationContext; nhập com.henrik.service.UserService; [] args) ném Ngoại lệ { //1, Tạo đối tượng vùng chứa lò xo ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //BeanFactory BeanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); //2, lấy đối tượng userService từ đối tượng container UserService userService = applicationContext.getBean("userService" , UserService.class); //3, gọi phương thức userService để xử lý logic nghiệp vụ userService.add(); }
Tôi đang cố gắng sử dụng giao diện nhiều hơn trong cơ sở mã của mình cho máy chủ trò chơi mà tôi đang viết và tìm hiểu về các khái niệm cấp cao cũng như khi nào tôi nên sử dụng giao diện (tôi nghĩ vậy). Trong trường hợp của tôi, tôi sử dụng chúng để tách các gói của mình ra khỏi nhau và tạo
Tôi có một giao diện tên là Widget mà tôi sử dụng trong suốt dự án của mình. Tuy nhiên, nó cũng được sử dụng làm Prop cho một thành phần có tên Widget. Cách tốt nhất để xử lý vấn đề này là gì? Tôi nên thay đổi Widget của mình
Một giao diện có thể là một trong nhiều giao diện giao diện a giao diện {x:string} b giao diện {y:string} c {z:st
Tôi gặp tình huống cần gọi dịch vụ của bên thứ ba để nhận một số thông tin. Những dịch vụ này có thể khác nhau tùy theo từng khách hàng. Tôi có chức năng xác thực trong giao diện của mình như hình bên dưới. giao diện IServiceProvider {bool
Trong ví dụ của tôi, "RequestHandlerProxy" là một cấu trúc có các trường là giao diện "IAdapter" và giao diện có các phương thức có thể được gọi có đầu vào là cấu trúc "Reque"
Tôi có một giao diện Interface1 đã được lớp A triển khai và một số giá trị biến riêng tư được đặt và tôi gửi đối tượng của lớp A đến lớp tiếp theo chấp nhận đầu vào là Giao diện2. Vậy làm thế nào tôi có thể chuyển đổi
Giả sử tôi có cấu trúc lớp và giao diện như thế này: giao diện IService {} giao diện IEmailService : IService { Task SendAs
Có ai biết tôi có thể tìm định nghĩa về giao diện XML-RPC (trong OpenERP 7) ở đâu không? Tôi muốn biết những thông số và thuộc tính đối tượng nào được yêu cầu để tạo hoặc lấy một đối tượng. Các ví dụ XML của từng phần tử cũng sẽ rất hữu ích. câu trả lời hay nhất
Gần đây tôi đã đọc về quan niệm sai lầm rằng giao diện là sự trừu tượng. Một bài đăng như vậy là http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstract
Nếu tôi có một phần tử IInterface hiện có do bên thứ ba triển khai và tôi muốn thêm các quy trình trợ giúp, Delphi có cung cấp cách dễ dàng nào để đạt được điều này mà không cần chuyển hướng thủ công mọi phương thức giao diện không? Nghĩa là, đưa ra
Tôi đang cố gắng gán một mảng Article cho tài liệu Mongoose của mình nhưng Typescript có vẻ không thích điều đó và tôi không biết tại sao nó lại hiển thị cảnh báo/lỗi này nói rằng nó không thể gán được.
Tôi có hai giao diện: giao diện công khai IController { void doSomething(IEntity thing } public inte);
Có thể tạo giao diện mở rộng giao diện Serializable không? Nếu vậy, giao diện mở rộng có hoạt động giống như giao diện Serilizable (int
Tôi đang cố gắng tạo một lớp trung gian giữa hai cửa hàng lấy dữ liệu từ bộ lưu trữ A, chuyển đổi nó thành loại tương ứng trong bộ lưu trữ B, sau đó lưu trữ dữ liệu đó. Vì tôi cần chuyển đổi khoảng 50-100 loại nên tôi muốn sử dụng map[string]func và thực hiện theo s
Tôi đang thực hiện một yêu cầu trong đó tôi nhận được một đối tượng JSON chứa giá trị ngày dưới dạng chuỗi. Nhiệm vụ của tôi là lưu trữ đối tượng Date trong cơ sở dữ liệu. Đại loại như thế này: {"start_date": "29-05-2019", "
Mục tiêu trong cách tiếp cận của chúng tôi là giới thiệu các giao diện cho các lớp mô hình và DAO hiện có của chúng tôi. Các lớp mô hình được xác định bằng nhiều loại ID tài nguyên khác nhau, không chỉ là số ngẫu nhiên mà còn có ngữ nghĩa và hành vi. Vì vậy, chúng ta phải sử dụng các đối tượng thay vì các kiểu nguyên thủy để biểu diễn
Giao diện Bộ sưu tập có nhiều phương thức. Giao diện Danh sách mở rộng giao diện Bộ sưu tập. Nó khai báo giao diện Collection(int
Tôi có một ứng dụng máy chủ Java sử dụng Jackson để thực hiện tuần tự hóa chung các DTO bằng API phản chiếu. Ví dụ: đối với giao diện DTO này: gói com.acme.libr
Nếu tôi có giao diện trong Kotlin: giao diện KotlinInterface { val id: String } thì tôi có thể triển khai giao diện đó như thế này: class MyCla
Tôi biết sự khác biệt giữa tất cả các công cụ sửa đổi quyền truy cập trong Java. Tuy nhiên, có người đã hỏi tôi một câu hỏi rất thú vị và tôi rất khó tìm ra câu trả lời: Sự khác biệt giữa giao diện riêng và giao diện chung trong Java là gì?
Tôi là một lập trình viên xuất sắc, rất giỏi!