Tại sao trường Spring @Autowosystem của tôi là rỗng?

635

Lưu ý: Đây là câu trả lời chính tắc cho một vấn đề chung.

Tôi có một @Servicelớp Spring ( MileageFeeCalculator) có một @Autowiredtrường ( rateService), nhưng trường là nullkhi tôi cố gắng sử dụng nó. Các bản ghi cho thấy rằng cả MileageFeeCalculatorbean và MileageRateServicebean đều đang được tạo, nhưng tôi nhận được NullPointerExceptionbất cứ khi nào tôi cố gắng gọi mileageChargephương thức trên service bean của mình. Tại sao Spring không tự động kích hoạt trường?

Lớp điều khiển:

@Controller
public class MileageFeeController {    
    @RequestMapping("/mileage/{miles}")
    @ResponseBody
    public float mileageFee(@PathVariable int miles) {
        MileageFeeCalculator calc = new MileageFeeCalculator();
        return calc.mileageCharge(miles);
    }
}

Hạng dịch vụ:

@Service
public class MileageFeeCalculator {

    @Autowired
    private MileageRateService rateService; // <--- should be autowired, is null

    public float mileageCharge(final int miles) {
        return (miles * rateService.ratePerMile()); // <--- throws NPE
    }
}

Đậu dịch vụ nên được tự động tải MileageFeeCalculatornhưng nó không được:

@Service
public class MileageRateService {
    public float ratePerMile() {
        return 0.565f;
    }
}

Khi tôi cố gắng GET /mileage/3, tôi nhận được ngoại lệ này:

java.lang.NullPointerException: null
    at com.chrylis.example.spring_autowired_npe.MileageFeeCalculator.mileageCharge(MileageFeeCalculator.java:13)
    at com.chrylis.example.spring_autowired_npe.MileageFeeController.mileageFee(MileageFeeController.java:14)
    ...

19 answers

675

Trường được chú thích @Autowirednulldo Spring không biết về bản sao của trường MileageFeeCalculatormà bạn đã tạo newvà không biết cách tự động truyền tải nó.

Vùng chứa Spring Inversion of Control (IoC) có ba thành phần logic chính: sổ đăng ký (được gọi là ApplicationContext) của các thành phần (bean) có sẵn để ứng dụng sử dụng, hệ thống cấu hình đưa các phụ thuộc của đối tượng vào chúng bằng cách khớp các phụ thuộc với bean trong ngữ cảnh và một bộ giải phụ thuộc có thể xem xét cấu hình của nhiều bean khác nhau và xác định cách khởi tạo và cấu hình chúng theo thứ tự cần thiết.

Vùng chứa IoC không phải là ma thuật và nó không có cách nào để biết về các đối tượng Java trừ khi bạn thông báo bằng cách nào đó về chúng. Khi bạn gọi new, JVM tạo một bản sao của đối tượng mới và giao nó thẳng cho bạn - nó không bao giờ trải qua quá trình cấu hình. Có ba cách để bạn có thể cấu hình bean của mình.

Tôi đã đăng tất cả mã này, sử dụng Spring Boot để khởi chạy, tại dự án GitHub này ; bạn có thể xem toàn bộ dự án đang chạy cho từng cách tiếp cận để xem mọi thứ bạn cần để làm cho nó hoạt động. Gắn thẻ với NullPointerException:nonworking

Chích đậu của bạn

Tùy chọn thích hợp nhất là để Spring tự động chạy tất cả các bean của bạn; điều này yêu cầu số lượng mã ít nhất và dễ bảo trì nhất. Để làm cho autowiring hoạt động như bạn muốn, cũng autowire MileageFeeCalculatornhư sau:

@Controller
public class MileageFeeController {

    @Autowired
    private MileageFeeCalculator calc;

    @RequestMapping("/mileage/{miles}")
    @ResponseBody
    public float mileageFee(@PathVariable int miles) {
        return calc.mileageCharge(miles);
    }
}

Nếu bạn cần tạo một phiên bản mới của đối tượng dịch vụ của mình cho các yêu cầu khác nhau, bạn vẫn có thể sử dụng tiêm bằng cách sử dụng phạm vi Spring bean .

Gắn thẻ hoạt động bằng cách chèn @MileageFeeCalculatorđối tượng dịch vụ:working-inject-bean

Sử dụng @Configurable

Nếu bạn thực sự cần các đối tượng được tạo newđể được tự động tải, bạn có thể sử dụng @Configurablechú thích Spring cùng với quá trình dệt thời gian biên dịch AspectJ để đưa các đối tượng của bạn vào. Cách tiếp cận này chèn mã vào phương thức khởi tạo của đối tượng của bạn để cảnh báo Spring rằng nó đang được tạo để Spring có thể cấu hình phiên bản mới. Điều này yêu cầu một chút cấu hình trong bản dựng của bạn (chẳng hạn như biên dịch với ajc) và bật trình xử lý cấu hình thời gian chạy của Spring ( @EnableSpringConfiguredvới cú pháp JavaConfig). Cách tiếp cận này được sử dụng bởi hệ thống Roo Active Record để cho phép các newcá thể của thực thể của bạn nhận được thông tin liên tục cần thiết được đưa vào.

@Service
@Configurable
public class MileageFeeCalculator {

    @Autowired
    private MileageRateService rateService;

    public float mileageCharge(final int miles) {
        return (miles * rateService.ratePerMile());
    }
}

Thẻ hoạt động bằng cách sử dụng @Configurabletrên đối tượng dịch vụ:working-configurable

Tra cứu đậu thủ công: không khuyến khích

Cách tiếp cận này chỉ thích hợp để giao tiếp với mã kế thừa trong các tình huống đặc biệt. Việc tạo một lớp bộ điều hợp singleton mà Spring có thể tự động truyền tải và mã kế thừa có thể gọi, nhưng có thể hỏi trực tiếp bối cảnh ứng dụng Spring cho một bean.

Để làm điều này, bạn cần một lớp mà Spring có thể cung cấp một tham chiếu đến ApplicationContextđối tượng:

@Component
public class ApplicationContextHolder implements ApplicationContextAware {
    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;   
    }

    public static ApplicationContext getContext() {
        return context;
    }
}

Sau đó, mã kế thừa của bạn có thể gọi getContext()và truy xuất các bean mà nó cần:

@Controller
public class MileageFeeController {    
    @RequestMapping("/mileage/{miles}")
    @ResponseBody
    public float mileageFee(@PathVariable int miles) {
        MileageFeeCalculator calc = ApplicationContextHolder.getContext().getBean(MileageFeeCalculator.class);
        return calc.mileageCharge(miles);
    }
}

Gắn thẻ hoạt động bằng cách tra cứu thủ công đối tượng dịch vụ trong ngữ cảnh Spring: working-manual-lookup

65
Shirish Coolkarni 2014-04-22 20:47.

Nếu bạn không viết mã ứng dụng web, hãy đảm bảo rằng lớp của bạn mà @Autowiring được thực hiện là một hạt đậu mùa xuân. Thông thường, spring container sẽ không nhận biết được lớp mà chúng ta có thể nghĩ là một spring bean. Chúng ta phải nói với Spring container về các lớp học mùa xuân của chúng ta.

Điều này có thể đạt được bằng cách định cấu hình trong appln-contxt hoặc cách tốt hơn là chú thích lớp là @Component và vui lòng không tạo lớp được chú thích bằng toán tử mới. Đảm bảo rằng bạn lấy nó từ Appln-context như bên dưới.

@Component
public class MyDemo {


    @Autowired
    private MyService  myService; 

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
            System.out.println("test");
            ApplicationContext ctx=new ClassPathXmlApplicationContext("spring.xml");
            System.out.println("ctx>>"+ctx);

            Customer c1=null;
            MyDemo myDemo=ctx.getBean(MyDemo.class);
            System.out.println(myDemo);
            myDemo.callService(ctx);


    }

    public void callService(ApplicationContext ctx) {
        // TODO Auto-generated method stub
        System.out.println("---callService---");
        System.out.println(myService);
        myService.callMydao();

    }

}
44
Ravi Durairaj 2016-07-26 23:25.

Trên thực tế, bạn nên sử dụng Đối tượng được quản lý bằng JVM hoặc Đối tượng được quản lý bằng mùa xuân để gọi các phương thức. từ mã trên của bạn trong lớp bộ điều khiển của bạn, bạn đang tạo một đối tượng mới để gọi lớp dịch vụ của bạn có một đối tượng có dây tự động.

MileageFeeCalculator calc = new MileageFeeCalculator();

vì vậy nó sẽ không hoạt động theo cách đó.

Giải pháp làm cho MileageFeeCalculator này trở thành một đối tượng có dây tự động trong chính Bộ điều khiển.

Thay đổi lớp Controller của bạn như bên dưới.

@Controller
public class MileageFeeController {

    @Autowired
    MileageFeeCalculator calc;  

    @RequestMapping("/mileage/{miles}")
    @ResponseBody
    public float mileageFee(@PathVariable int miles) {
        return calc.mileageCharge(miles);
    }
}
26
smwikipedia 2015-11-13 03:41.

Tôi đã từng gặp phải vấn đề tương tự khi tôi chưa quen với cuộc sống trong thế giới IoC . Cánh @Autowiredđồng của một trong những hạt đậu của tôi trống trong thời gian chạy.

Nguyên nhân gốc rễ là, thay vì sử dụng bean được tạo tự động được duy trì bởi vùng chứa Spring IoC (có @Autowiredtrường thực sự được đưa vào đúng cách), tôi đang nhập newphiên bản của riêng mình về loại bean đó và sử dụng nó. Tất nhiên @Autowiredtrường này là trống vì Spring không có cơ hội để tiêm vào.

22
Deepak 2015-10-08 23:17.

Vấn đề của bạn là mới (tạo đối tượng theo kiểu java)

MileageFeeCalculator calc = new MileageFeeCalculator();

Với chú thích @Service, @Component, @Configurationđậu được tạo ra trong
bối cảnh ứng dụng của mùa xuân khi máy chủ được bắt đầu. Nhưng khi chúng ta tạo đối tượng bằng toán tử mới, đối tượng không được đăng ký trong ngữ cảnh ứng dụng đã được tạo. Đối với ví dụ lớp Employee.java tôi đã sử dụng.

Kiểm tra cái này:

public class ConfiguredTenantScopedBeanProcessor implements BeanFactoryPostProcessor {

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    String name = "tenant";
    System.out.println("Bean factory post processor is initialized"); 
    beanFactory.registerScope("employee", new Employee());

    Assert.state(beanFactory instanceof BeanDefinitionRegistry,
            "BeanFactory was not a BeanDefinitionRegistry, so CustomScope cannot be used.");
    BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;

    for (String beanName : beanFactory.getBeanDefinitionNames()) {
        BeanDefinition definition = beanFactory.getBeanDefinition(beanName);
        if (name.equals(definition.getScope())) {
            BeanDefinitionHolder proxyHolder = ScopedProxyUtils.createScopedProxy(new BeanDefinitionHolder(definition, beanName), registry, true);
            registry.registerBeanDefinition(beanName, proxyHolder.getBeanDefinition());
        }
    }
}

}
13
bluish 2015-05-15 02:44.

Tôi mới sử dụng Spring, nhưng tôi đã phát hiện ra giải pháp hiệu quả này. Xin vui lòng cho tôi biết nếu đó là một cách đáng trách.

Tôi làm cho Spring tiêm applicationContextvào bean này:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class SpringUtils {

    public static ApplicationContext ctx;

    /**
     * Make Spring inject the application context
     * and save it on a static variable,
     * so that it can be accessed from any point in the application. 
     */
    @Autowired
    private void setApplicationContext(ApplicationContext applicationContext) {
        ctx = applicationContext;       
    }
}

Bạn cũng có thể đặt mã này trong lớp ứng dụng chính nếu muốn.

Các lớp khác có thể sử dụng nó như thế này:

MyBean myBean = (MyBean)SpringUtils.ctx.getBean(MyBean.class);

Bằng cách này, bất kỳ bean nào cũng có thể được lấy bởi bất kỳ đối tượng nào trong ứng dụng (cũng như trong ứng dụngnew ) và theo cách tĩnh .

12
Alireza Fattahi 2016-06-12 05:15.

Đó có vẻ là trường hợp hiếm gặp nhưng đây là những gì đã xảy ra với tôi:

Chúng tôi đã sử dụng @Injectthay vì @Autowiredđó là tiêu chuẩn javaee được hỗ trợ bởi Spring. Mọi nơi nó hoạt động tốt và những hạt đậu được tiêm đúng cách, thay vì một nơi. Việc tiêm đậu có vẻ giống nhau

@Inject
Calculator myCalculator

Cuối cùng, chúng tôi phát hiện ra rằng lỗi là do chúng tôi (thực sự là tính năng tự động hoàn thành của Eclipse) đã nhập com.opensymphony.xwork2.Injectthay vì javax.inject.Inject!

Vì vậy, để tóm tắt, hãy chắc chắn rằng chú thích của bạn ( @Autowired, @Inject, @Service, ...) có các gói đúng!

6
Brent Bradburn 2018-04-13 08:25.

Nếu điều này đang xảy ra trong một lớp kiểm tra, hãy đảm bảo rằng bạn không quên chú thích lớp đó.

Ví dụ, trong Spring Boot :

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTests {
    ....

Một thời gian nữa sẽ trôi qua ...

Spring Boot tiếp tục phát triển . Nó không còn bắt buộc phải sử dụng @RunWith nếu bạn sử dụng đúng phiên bản JUnit .

Để @SpringBootTestlàm việc độc lập, bạn cần sử dụng @Testtừ JUnit5 thay vì JUnit4 .

//import org.junit.Test; // JUnit4
import org.junit.jupiter.api.Test; // JUnit5

@SpringBootTest
public class MyTests {
    ....

Nếu bạn sai cấu hình này, các bài kiểm tra của bạn sẽ biên dịch, nhưng @Autowired@Valuecác trường (ví dụ) sẽ như vậy null. Vì Spring Boot hoạt động bằng phép thuật, bạn có thể có một số cách để gỡ lỗi trực tiếp lỗi này.

5
msucil 2017-01-11 08:00.

Tôi nghĩ rằng bạn đã bỏ lỡ việc hướng dẫn mùa xuân quét các lớp bằng chú thích.

Bạn có thể sử dụng @ComponentScan("packageToScan")trên lớp cấu hình của ứng dụng mùa xuân của mình để hướng dẫn quét mùa xuân.

@Service, @Component vv chú thích thêm mô tả meta.

Spring chỉ đưa các phiên bản của các lớp đó được tạo dưới dạng bean hoặc được đánh dấu bằng chú thích.

Các lớp được đánh dấu bằng chú thích cần được xác định bằng mùa xuân trước khi tiêm, @ComponentScanhướng dẫn mùa xuân tìm kiếm các lớp được đánh dấu bằng chú thích. Khi Spring tìm thấy @Autowirednó sẽ tìm kiếm bean liên quan và đưa vào phiên bản cần thiết.

Chỉ thêm chú thích, không sửa chữa hoặc tạo điều kiện cho việc tiêm phụ thuộc, Spring cần biết nơi để tìm.

4
Ondrej Bozek 2015-04-22 01:35.

Một giải pháp khác sẽ là đặt lệnh gọi: SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)
To MileageFeeCalculator constructor như thế này:

@Service
public class MileageFeeCalculator {

    @Autowired
    private MileageRateService rateService; // <--- will be autowired when constructor is called

    public MileageFeeCalculator() {
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)
    }

    public float mileageCharge(final int miles) {
        return (miles * rateService.ratePerMile()); 
    }
}
3
62mkv 2017-10-12 18:43.

CẬP NHẬT: Những người thực sự thông minh đã nhanh chóng chỉ ra câu trả lời này , điều này giải thích sự kỳ lạ, được mô tả bên dưới

CÂU TRẢ LỜI GỐC:

Tôi không biết nó có giúp được ai không, nhưng tôi đã bị mắc kẹt với cùng một vấn đề ngay cả khi đang làm những việc có vẻ đúng. Trong phương thức Chính của tôi, tôi có một đoạn mã như sau:

ApplicationContext context =
    new ClassPathXmlApplicationContext(new String[] {
        "common.xml",
        "token.xml",
        "pep-config.xml" });
    TokenInitializer ti = context.getBean(TokenInitializer.class);

và trong một token.xmltệp tôi có một dòng

<context:component-scan base-package="package.path"/>

Tôi nhận thấy rằng package.path không còn tồn tại nữa, vì vậy tôi đã bỏ dòng cho tốt.

Và sau đó, NPE bắt đầu xuất hiện. pep-config.xmlTôi chỉ có 2 đậu:

<bean id="someAbac" class="com.pep.SomeAbac" init-method="init"/>
<bean id="settings" class="com.pep.Settings"/>

và lớp SomeAbac có thuộc tính được khai báo là

@Autowired private Settings settings;

vì một số lý do không xác định, cài đặt là null trong init (), khi <context:component-scan/>phần tử không có ở tất cả, nhưng khi nó hiện diện và có một số bs làm basePackage, mọi thứ hoạt động tốt. Dòng này bây giờ trông như thế này:

<context:component-scan base-package="some.shit"/>

Và nó hoạt động. Có thể ai đó có thể cung cấp lời giải thích, nhưng đối với tôi bây giờ là đủ)

3
Atul Jain 2019-05-06 21:02.

Đây là thủ phạm của việc tạo NullPointerException MileageFeeCalculator calc = new MileageFeeCalculator();Chúng tôi đang sử dụng Spring - không cần tạo đối tượng theo cách thủ công. Việc tạo đối tượng sẽ do IoC container đảm nhận.

2
Abhishek 2016-10-14 08:41.

Bạn cũng có thể khắc phục sự cố này bằng cách sử dụng chú thích @Service trên lớp dịch vụ và chuyển lớp bean cần thiết làm tham số cho phương thức khởi tạo lớpB đậu khác và chú thích phương thức khởi tạo của classB bằng @Autowosystem. Đoạn mã mẫu ở đây:

@Service
public class ClassB {

    private ClassA classA;

    @Autowired
    public ClassB(ClassA classA) {
        this.classA = classA;
    }

    public void useClassAObjectHere(){
        classA.callMethodOnObjectA();
    }
}
2
samuelj90 2019-11-27 18:44.

Nói một cách đơn giản, chủ yếu có hai lý do để một @Autowiredtrườngnull

  • LỚP CỦA BẠN KHÔNG PHẢI LÀ ĐẬU XUÂN.

  • LĨNH VỰC KHÔNG PHẢI LÀ ĐẬU.

1
JackLeEmmerdeur 2019-07-06 04:51.

Điều gì đã không được đề cập ở đây được mô tả trong này viết trong đoạn "Trình tự thực hiện".

Sau khi "học" rằng tôi phải chú thích một lớp với @Component hoặc các dẫn xuất @Service hoặc @Repository (tôi đoán có nhiều hơn nữa), để tự động truyền tải các thành phần khác bên trong chúng, tôi nhận ra rằng các thành phần khác này vẫn còn trống bên trong hàm tạo của thành phần mẹ.

Sử dụng @PostConstruct giải quyết được điều đó:

@SpringBootApplication
public class Application {
    @Autowired MyComponent comp;
}

và:

@Component
public class MyComponent {
    @Autowired ComponentDAO dao;

    public MyComponent() {
        // dao is null here
    }

    @PostConstruct
    public void init() {
        // dao is initialized here
    }
}
1
Rishabh Agarwal 2019-12-21 06:33.

Điều này chỉ hợp lệ trong trường hợp Unit test.

Lớp Dịch vụ của tôi có chú thích về dịch vụ và nó là @autowiredmột lớp thành phần khác. Khi tôi kiểm tra lớp thành phần đã bị null. Vì đối với lớp dịch vụ, tôi đã tạo đối tượng bằng cách sử dụngnew

Nếu bạn đang viết unit test, hãy đảm bảo rằng bạn không tạo đối tượng bằng cách sử dụng new object(). Thay vào đó, sử dụng injectionMock.

Điều này đã khắc phục sự cố của tôi. Đây là một liên kết hữu ích

0
yglodt 2019-01-12 05:55.

Cũng lưu ý rằng nếu, vì bất kỳ lý do gì, bạn tạo một phương thức @Servicenhư final, các bean tự động mà bạn sẽ truy cập từ nó sẽ luôn như vậy null.

0
Deadpool 2020-05-12 03:31.

Không hoàn toàn liên quan đến câu hỏi, nhưng nếu trường chèn là null, thì phương thức tiêm dựa trên hàm tạo vẫn hoạt động tốt.

    private OrderingClient orderingClient;
    private Sales2Client sales2Client;
    private Settings2Client settings2Client;

    @Autowired
    public BrinkWebTool(OrderingClient orderingClient, Sales2Client sales2Client, Settings2Client settings2Client) {
        this.orderingClient = orderingClient;
        this.sales2Client = sales2Client;
        this.settings2Client = settings2Client;
    }
0
Ashutosh Tiwari 2020-10-26 01:39.

Một trong những cách dưới đây sẽ hoạt động:

  1. Lớp mà bạn đang sử dụng @Autowosystem không phải là Bean (Bạn có thể đã sử dụng new () ở đâu đó mà tôi chắc chắn).

  2. Bên trong lớp SpringConfig, bạn chưa đề cập đến các gói mà Spring nên tìm kiếm @Component (Tôi đang nói về @ComponentScan (basePackages "tại đây"))

Nếu hai phần trên không hoạt động .... hãy bắt đầu đặt System.out.println () và tìm ra chỗ sai.

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

BoJack Horseman vẫn gan ruột và gan dạ hơn bao giờ hết trong phần 3

BoJack Horseman vẫn gan ruột và gan dạ hơn bao giờ hết trong phần 3

BoJack Horseman (Ảnh: Netflix) BoJack Horseman bắt đầu mùa thứ ba với sự xuất hiện của nhân vật tiêu biểu, người vẫn đang theo đuổi những lời khen ngợi từ giới phê bình trong một nỗ lực tuyệt vọng để tìm ra ý nghĩa trong cuộc sống của mình. Mùa thứ hai về số phận bi kịch của Raphael Bob-Waksberg dày đặc những trò đùa cũng như tuyệt vọng.

Xem cách tính năng lái tự động cập nhật của Tesla bùng phát như thế nào khi bạn bỏ qua các cảnh báo của nó

Xem cách tính năng lái tự động cập nhật của Tesla bùng phát như thế nào khi bạn bỏ qua các cảnh báo của nó

Bản nâng cấp Phiên bản 8.0 gần đây của Tesla đối với hệ thống Lái xe tự động được thiết kế để cải thiện hệ thống và mối quan hệ của nó với người lái.

UnREAL, Chương trình Truyền hình Về Truyền hình Thực tế Chúng tôi Không biết Chúng tôi Cần

UnREAL, Chương trình Truyền hình Về Truyền hình Thực tế Chúng tôi Không biết Chúng tôi Cần

Chắc chắn khi con cái chúng ta xem lại các chương trình chúng ta đã xem vào khoảng năm 2015, chúng sẽ thấy UnREAL, một chương trình truyền hình mới chiếu vào tối Thứ Hai của Lifetime — bạn sẽ thấy đúng lúc, sẽ phát sóng ngay sau khi The Bachelor kết thúc — như một chương trình không thể được thực hiện vào bất kỳ thời điểm nào khác trong lịch sử truyền hình, nhưng một chương trình cảm thấy cần thiết để xem bây giờ. UnREAL có sự tham gia của Shiri Appleby trong vai Rachel, một nhà sản xuất truyền hình cho một chương trình về cơ bản là The Bachelor, mặc dù trong thế giới này, nó được gọi là Vĩnh viễn.

Sau tất cả, Josh Trank sẽ không đạo diễn bộ phim tuyển tập Star Wars thứ hai

Sau tất cả, Josh Trank sẽ không đạo diễn bộ phim tuyển tập Star Wars thứ hai

Thông báo chính thức đến trực tiếp từ trang web của Star Wars: Fantastic Four, đạo diễn Josh Trank, một người bí ẩn không xuất hiện tại đại hội Star Wars Celebration gần đây, sẽ không chỉ đạo phần hai Star Wars Anthology. Đây là tuyên bố được đăng ngày hôm qua: Tất cả thực sự là ngôn ngữ rất lịch sự, nhưng một bài báo của Hollywood Reporter cho thấy tất cả đều không tốt ở hậu trường, gọi sự ra đi là "một vụ sa thải" một phần dựa trên "hành vi bất thường" của Trank trong khi quay Fantastic Four: The Bài báo trích dẫn các nguồn gọi là Trank “đôi khi thiếu quyết đoán và thiếu sáng tạo,” và lưu ý rằng Fantastic Four, khởi chiếu vào ngày 7 tháng 8, đã được khởi động lại vào cuối tháng 4.

Edwin McCain ra mắt Grand Ole Opry: Quay cảnh hậu trường với nhạc sĩ 'I'll Be'

Edwin McCain ra mắt Grand Ole Opry: Quay cảnh hậu trường với nhạc sĩ 'I'll Be'

McCain, người đang làm việc cho một album mới, lần đầu tiên bước vào vòng kết nối vào tối thứ Sáu ở Nashville

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Tôi viết như thế nào

Tôi viết như thế nào

Đối với tôi, mọi thứ là về dòng đầu tiên đó và nó sẽ đưa bạn đến đâu. Một số nhà văn bị điều khiển bởi cốt truyện, sự sắp xếp tinh tế của các quân cờ, trong khi những người khác bị lôi cuốn bởi một nhân vật và khả năng thực hiện một cuộc hành trình với một người bạn hư cấu mới.

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Language